`
swanky_yao
  • 浏览: 30806 次
  • 性别: 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
分享到:
评论

相关推荐

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

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

    asp.net知识库

    在ASP.Net中两种利用CSS实现多界面的方法 如何在客户端调用服务端代码 页面一postback,它就显示页面的最顶端,怎样让它定位在某一位置? 如何保证页面刷新后的滚动条位置 清除网页历史记录,屏蔽后退按钮! 如何传值...

    计算机二级C语言考试题预测

    算法的执行效率与数据的存储结构无关 B. 算法的空间复杂度是指算法程序中指令(或语句)的条数 C. 算法的有穷性是指算法必须能在执行有限个步骤之后终止 D. 以上三种描述都不对 (2) 以下数据结构中不属于线性数据...

    javaSE代码实例

    第16章 多线程——Java中的并发协作 343 16.1 线程的基本知识 343 16.1.1 多线程编程的意义 343 16.1.2 定义自己的线程 344 16.1.3 创建线程对象 345 16.1.4 启动线程 347 16.1.5 同时使用多个线程 ...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    Oracle中权限主要分为两种,系统权限和实体权限。  系统权限:系统规定用户使用数据库的权限。(系统权限是对用户而言)。  DBA: 拥有全部特权,是系统最高权限,只有DBA才可以创建数据库结构。  RESOURCE:...

    CuteFTP9简易汉化版

    在一种上传软件高级Transfers-Other传输选项包括传输模式(ASCII和二进制/汽车),数据连接模式(PASV /端口/汽车),转移事件后,时间戳处理,重启的字节抵消破碎的转移,更多。 自动化 转移Engine-Create复杂的自动化脚本或...

    复旦nois教材01.rar

    2.1 创建Quartus II工程...........................................................................................................8 2.2 创建 Nios 系统模块..................................................

Global site tag (gtag.js) - Google Analytics