繁体   English   中英

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

[英]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()

协程

诸如greenletgevent类的库提供了称为协程的东西,它应该比线程处理要快。 没有提供示例,如果您有兴趣,请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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM