如何同时运行两个python循环?

时间:2010-08-13 06:23:49

标签: python concurrency

假设我在Python中有以下内容

# A loop
for i in range(10000):
    Do Task A

# B loop
for i in range(10000):
    Do Task B

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

7 个答案:

答案 0 :(得分:25)

如果你想要并发,这是一个非常简单的例子:

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以了解正在发生的事情。

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

如果您不介意global interpreter lock,则可以使用线程。进程实例化的成本更高,但它们提供了真正的并发性。

答案 1 :(得分:12)

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

for i in range(10000):
    doTaskA()
    doTaskB()

你问题的明显答案是使用线程 - 请参阅python threading模块。然而,线程是一个很大的主题,并且有许多陷阱,所以在你走这条路之前先阅读它。

或者,您可以使用python multiprocessing模块在​​单独的过程中运行任务。如果两个任务都是CPU密集型,这将更好地利用计算机上的多个核心。

还有其他选项,例如协同程序,无堆栈tasklet,greenlet,CSP等,但是如果不了解任务A和任务B以及为什么需要同时运行它们,则无法给出更具体的答案。

答案 2 :(得分:9)

您可能有多种可能的选择:

使用循环

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

for i in xrange(10000):
    # use xrange instead of range
    taskA()
    taskB()

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

缺点:taskB必须在taskA之后完成,否则就完成了。它们无法同时运行。

多进程

另一个想法是:同时运行两个进程,python提供multiprocess library,以下是一个简单的例子:

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或更多),那就不是你想要的。

线程

线程就像进程一样,只是轻量级。看看this post。它们的用法非常相似:

import threading 


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

p1.start()
p2.start()

协程

greenletgevent这样的库提供了一种叫做coroutines的东西,它应该比线程更快。没有提供示例,如果您有兴趣,请谷歌如何使用它们。

优点:更灵活轻便

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

答案 3 :(得分:7)

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()

答案 4 :(得分:1)

如何:范围内的循环(10000):执行任务A,执行任务B?没有更多信息,我没有更好的答案。

答案 5 :(得分:1)

您可以使用threadingmultiprocessing

答案 6 :(得分:0)

我发现使用" pool"子模块"多处理"在Python脚本中同时执行多个进程非常有效。

See Section: Using a pool of workers

仔细查看"#异步启动多个评估可能使用更多进程"在示例中。一旦你理解了这些行正在做什么,我构建的下面的例子就会很有意义。

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!

代码基本上会为一定数量的进程运行所需的函数。您必须仔细确保您的功能可以区分每个进程(因此我添加了变量"选项&#34 ;.)此外,它不必是一个正在填充的数组结束,但就我的例子而言,这就是我如何使用它。希望这可以简化或帮助您更好地理解Python中多处理的强大功能!