`
swanky_yao
  • 浏览: 31475 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

利用工厂模式处理并发与顺序两种执行方式

阅读更多
在程序中经常会用到并发与顺序执行的情况,在每次需要并发的时候,再去分配线程的话,会显得整个代码很乱,所以,在这里我用一个工厂类ExecutorFactory来创建不同的执行类:ConcurExecutor和SequenExecutor。

先看看代码再说:
ExecutorFactory.py:
from ConcurExecutor import ConcurExecutor
from SequenExecutor import SequenExecutor

class ExecutorFactory:
    def __init__(self):
        pass

    def createExecutor(self, type):
        if "concurrence" == type:
            executor = ConcurExecutor()
        elif "sequence" == type:
            executor = SequenExecutor()

        return executor


ConcurExecutor.py:

import threading

class JobThread(threading.Thread):
    def __init__(self, func, args):
        threading.Thread.__init__(self)
        self.func = func
        self.args = args
        self.result = False
    def run(self):
        self.result = apply(self.func, self.args)
    def getResult(self):
        return self.result

class ConcurExecutor:
    def __init__(self):
        self.jobList = []
    def addJob(self, jobFunc, jobArgs, env):
        jobThread = JobThread(jobFunc, (jobArgs, env))
        self.jobList.append(jobThread)
    def execJobs(self):
        for jobThread in self.jobList:
            jobThread.start()
        for jobThread in self.jobList:
            jobThread.join()
    def isAllSucc(self):
        for jobThread in self.jobList:
            if False == jobThread.getResult():
                return False
        return True


SequenExecutor.py:
class SequenExecutor:
    def __init__(self):
        self.jobList = []
        self.resultList = []
    def addJob(self, jobFunc, jobArgs, env):
        job = (jobFunc, jobArgs, env)
        self.jobList.append(job)

    def execJobs(self):
        for job in self.jobList:
            result = job[0](job[1], job[2])
            self.resultList.append(result)

    def isAllSucc(self):
        if all(result for result in self.resultList):
            return True
        return False




我们使用的时候可以这样写:

executorFactory = ExecutorFactory()

executor = executorFactory.createExecutor('sequence') #当然这里也可以改成并发
    for elm_scene in elm_branch.getchildren():
        executor.addJob(SceneAction, (elm_scene, brchLogger), envClone(env))
    executor.execJobs()
    result = executor.isAllSucc()



这样,当我们的项目里,多个地方需要并发或顺序处理的时候,就不会很混乱了。

0
0
分享到:
评论

相关推荐

    软件工程中的并发与并行计算.pptx

    - **资源竞争与死锁**:在并发环境下,资源的竞争可能导致死锁现象的发生,即两个或更多的进程在等待彼此释放资源,从而无法继续执行。 **基本概念** - **进程与线程**: - **进程**:是操作系统中能够独立运行的...

    软件工程中的并发编程与多线程技术.pptx

    ### 软件工程中的并发编程与多线程技术 #### 第一章:简介 **并发编程与多线程技术概述** 并发编程是指在一段给定的时间内能够同时处理多个计算任务的技术。随着多核处理器的普及和发展,利用并发编程能够显著...

    java并发编程-超级大全整理

    死锁是并发编程中常见的问题,两个或更多线程相互等待对方释放资源,导致无法继续执行。通过合理设计资源获取顺序、设置超时和使用死锁检测算法等方法,可以避免死锁的发生。 ### 七、线程池 线程池通过预先创建...

    Java并发编程(学习笔记).xmind

    Java并发编程 背景介绍 并发历史 必要性 进程 资源分配的最小单位 线程 CPU调度的最小单位 线程的优势 (1)如果设计正确,多线程程序可以通过提高处理器资源的利用率来提升系统吞吐率 ...

    23种设计模式.docx

    虽然这两种模式没有包含在23种经典设计模式之中,但它们在现代并发编程中非常关键: - **并发型模式**:关注于如何管理多线程环境下的任务调度与执行,提高系统的并发性能。 - **线程池模式**:通过重用预先创建的...

    Java 多线程 设计模式

    - **线程的创建**:Java提供了两种创建线程的方式,一是通过实现`Runnable`接口,二是继承`Thread`类。推荐使用`Runnable`接口,因为Java是单继承的,避免了类的继承限制。 - **线程状态**:线程有新建、就绪、...

    如何优化多核处理器环境下的信号处理性能.pdf

    以双通道采样为例,如果需要对两个通道的高速数字化仪数据进行快速傅立叶变换(FFT),传统顺序编程方式会逐一读取和分析每个通道的数据。但在LabVIEW中,只需调整算法结构,系统会自动将这两个通道的数据并行处理,...

    Concurrent+Programming+in+Java+-+Design+Principles+and+Patterns,+Second+Edition_

    ### 并发编程在Java中的设计原则与模式(第二版) #### 一、并发对象导向编程 本章节作为本书的开篇,旨在介绍如何在Java编程语言中思考、设计和实现并发程序。大部分内容假设读者已经是一位有经验的对象导向编程...

    java多线程设计模式详解+源码

    4. **死锁**:当两个或更多线程互相等待对方释放资源而形成的一种僵局,防止死锁的关键是合理设计资源获取顺序和避免循环等待。 5. **线程通信**:使用wait()、notify()和notifyAll()方法可以实现线程间的通信。...

    java nio 原理浅析

    Netty提供了MemoryAwareThreadPoolExecutor和OrderedMemoryAwareThreadPoolExecutor两种线程池选项,前者限制待处理任务的数量,后者在保持事件顺序的同时处理任务。 2. **Buffer机制**: - **ChannelBuffer**:...

    组件模型与双事件处理线程

    双事件处理线程(或称为双线程模型)是一种特定的并发设计模式,常用于GUI应用中。在这种模型中,有两个主要的线程:一个主线程,通常负责用户界面的更新,确保UI的响应性;另一个后台线程,用于处理耗时的任务,如...

    JavaConcurrencyPractice:java并发编程

    创建线程有两种方式:继承`Thread`类或实现`Runnable`接口。 2. **同步机制**:为了防止多个线程同时访问共享资源导致的数据不一致,Java提供了多种同步机制,如`synchronized`关键字、`Lock`接口(如`...

    2023年全国计算机等级考试四级数据库工程师真题.doc

    4. **事务活锁**:事务活锁是并发控制中的一种异常情况,两个或多个事务因相互等待对方释放资源而无法继续执行。为了避免活锁,可以采取先来服务策略、两阶段锁协议等方法。选项A的先来服务策略可以避免活锁,因为它...

    FPGA内嵌的块RAM及其在FFT算法中的应用

    通过巧妙利用BRAM的不同配置模式,不仅可以优化FFT的存储策略,还能大幅提高算法的执行效率,为各类信号处理和通信应用提供强大的硬件支撑。随着FPGA技术的不断进步和创新,BRAM在FFT及其他计算密集型任务中的应用...

    计算机四级嵌入式参考资料.docx

    14. **8086的IO寻址和中断向量表**:8086的IO寻址空间为64KB,中断向量表存储256个中断向量,每个中断对应特定的处理方式。 15. **中断优先级**:中断优先级由高到低排列,包括除法错、INTn、INTO、NMI和INTR。 16...

    使用Task C#的责任链和策略模式

    在批处理任务中,策略模式可以帮助我们灵活地选择不同的处理方式,比如并发执行、串行执行或者基于优先级的执行。 现在,结合Task类,我们可以利用异步编程来提高批处理效率。Task类是.NET Framework的一部分,它...

Global site tag (gtag.js) - Google Analytics