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

在程序中经常会用到并发与顺序执行的情况,在每次需要并发的时候,再去分配线程的话,会显得整个代码很乱,所以,在这里我用一个工厂类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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值