[英]How do I run two python loops concurrently?
假设我在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()
您问题的明显答案是使用线程-请参阅python 线程模块。 但是线程是一个大主题,有很多陷阱,因此在继续之前,请仔细阅读线程。
或者,您可以使用python 多处理模块在单独的过程中运行任务。 如果这两项任务都占用大量CPU,则可以更好地利用计算机上的多个内核。
还有其他选项,例如协程,无堆栈的tasklet,greenlets,CSP等,但是如果不了解任务A和任务B以及为什么需要同时运行它们,就无法给出更具体的答案。
有许多可能的选项供您选择:
正如许多人指出的那样,这是最简单的方法。
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()
优点:任务可以在后台simultaneously
运行,可以控制任务(结束,停止等),任务可以交换数据,如果它们竞争相同的资源则可以同步等。
缺点:太重了!OS会经常在它们之间切换,即使数据是冗余的,它们也有自己的数据空间。 如果您有很多任务(例如100或更多),那不是您想要的。
线程就像进程,只是轻量级的。 查看这篇文章 。 它们的用法非常相似:
import threading
p1 = threading.Thread(target=taskA, args=(*args, **kwargs))
p2 = threading.Thread(target=taskB, args=(*args, **kwargs))
p1.start()
p2.start()
诸如greenlet
和gevent
类的库提供了称为协程的东西,它应该比线程处理要快。 没有提供示例,如果您有兴趣,请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()
怎么样:范围为(10000)的i的循环:是任务A,任务B吗? 没有更多信息,我没有更好的答案。
我发现在“多重处理”中使用“池”子模块可以惊人地在Python脚本中一次执行多个进程。
仔细查看示例中的“#异步启动多个评估可能会使用更多进程”。 一旦了解了这些行的功能,下面构建的示例将很有意义。
import numpy as np
from multiprocessing import Pool
def desired_function(option, processes, data, etc...):
# your code will go here. option allows you to make choices within your script
# to execute desired sections of code for each pool or subprocess.
return result_array # "for example"
result_array = np.zeros("some shape") # This is normally populated by 1 loop, lets try 4.
processes = 4
pool = Pool(processes=processes)
args = (processes, data, etc...) # Arguments to be passed into desired function.
multiple_results = []
for i in range(processes): # Executes each pool w/ option (1-4 in this case).
multiple_results.append(pool.apply_async(param_process, (i+1,)+args)) # Syncs each.
results = np.array(res.get() for res in multiple_results) # Retrieves results after
# every pool is finished!
for i in range(processes):
result_array = result_array + results[i] # Combines all datasets!
该代码基本上将为一组进程运行所需的功能。 您必须仔细确保您的函数可以区分每个进程(因此,为什么要添加变量“ option”。)此外,它不必是最后要填充的数组,但对于我的示例,这就是我使用它的方式。 希望这可以简化或帮助您更好地了解Python中多处理的功能!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.