转到下一个迭代,而无需等待当前迭代完成

时间:2019-08-23 19:22:48

标签: python python-3.x python-multiprocessing

我有一个过程非常耗时的循环,而不是等待每个过程完成以进行下一个迭代,是否有可能运行该过程并仅移至下一个迭代而无需等待其完成?

示例:给定文本,脚本应尝试从Web查找匹配的链接,并从本地磁盘查找文件。两者都只返回链接或路径的列表。

for proc in (web_search, file_search):
   results = proc(text)
   yield from results

作为解决方案,我需要在执行工作时使用计时器。如果时间超过等待时间,则应将过程移至托盘并要求从那里开始工作。现在,我将进行下一个迭代并重复相同的步骤。循环结束后,我将从移动到托盘的过程中收集结果。

但是我认为,应该有一个更好的方法。 实际上,我在StackOverflow中搜索了此类问题,但找不到类似的内容,因此我不介意将其标记为重复的^^

1 个答案:

答案 0 :(得分:0)

在简单情况下,目标是让每个进程同时运行,我们可以使用Thread模块中的threading。 因此,我们可以解决这样的问题,我们将每个过程都设为Thread,并要求其将结果放入列表或其他集合中。代码如下:

from threading import Thread

results = []

def add_to_collection(proc, args, collection):
    '''proc is the function, args are the arguments to pass to it.
       collection is our container (here it is the list results) for
       collecting results.'''
    result = proc(*args)
    collection.append(result)
    print("Completed":, proc)

# Now we do our time consuming tasks

for proc in (web_search, file_search):
    t = Thread(target=add_to_collection, args=(proc, ()))
    # We assume proc takes no arguments
    t.start()

对于复杂的任务,如注释中所述,最好与multiprocessing.pool.Pool一起使用。