concurrency - 并发 - 如何同时运行两个python循环?

假设我在python中有以下


# A loop


for i in range(10000):


 Do Task A



# B loop


for i in range(10000):


 Do Task B



如何在python中同时运行这些循环?

时间:

如果需要并发,下面是一个非常简单的例子:


from multiprocessing import Process



def loop_a():


 while 1:


 print("a")



def loop_b():


 while 1:


 print("b")



if __name__ == '__main__':


 Process(target=loop_a).start()


 Process(target=loop_b).start()



这只是我能想到的最基本的例子,请务必阅读http://docs.python.org/library/multiprocessing.html以便了解发生了什么。

如果你想将数据发送回程序,我建议使用队列(根据我的经验,这个最容易使用)。

你可以使用一个线程,如果你不介意全局解释器锁定 ,进程实例化的成本更高,但是,它们提供了真正的并发性。

你为什么要同时运行这两个进程? 是因为你认为他们会更快(他们很可能不会更快)。为什么不在同一循环中运行任务呢,例如,


for i in range(10000):


 doTaskA()


 doTaskB()



你需要的选项有许多可能的选项:

使用循环

就像许多人所指出的,这是最简单的方法。


for i in xrange(10000):


 # use xrange instead of range


 taskA()


 taskB()



优点:易于理解和使用,不需要额外的库。

缺点:taskB必须在taskA之后完成,否则它们不能同时运行。

多重进程

另一种想法是:同时运行两个进程,python提供多进程库,下面是一个简单的例子:


from multiprocessing import Process



p1 = Process(target=taskA, args=(*args, **kwargs))


p2 = Process(target=taskB, args=(*args, **kwargs))



p1.start()


p2.start()



优点:任务可以在后台同时运行,可以控制任务(结束,停止等),任务可以交换数据,如果他们竞争相同的资源等可以同步。

线程处理

线程就像进程,只是轻量级的,查看这篇文章 ,它们的用法非常相似:


import threading 



p1 = threading.Thread(target=taskA, args=(*args, **kwargs))


p2 = threading.Thread(target=taskB, args=(*args, **kwargs))



p1.start()


p2.start()



协同

greenletgevent这样的库提供了一些称为coroutines的东西,这应该比线程处理要快,没有提供例子,如果你有兴趣,请google如何使用它们。

优点:更灵活,更轻量

缺点:需要额外的库,学习曲线。


from threading import Thread


def loopA():


 for i in range(10000):


 #Do task A


def loopB():


 for i in range(10000):


 #Do task B


threadA = Thread(target = loopA)


threadB = Thread(target = loobB)


threadA.run()


threadB.run()


# Do work indepedent of loopA and loopB 


threadA.join()


threadB.join()



...