我有一个过程非常耗时的循环,而不是等待每个过程完成以进行下一个迭代,是否有可能运行该过程并仅移至下一个迭代而无需等待其完成?>
示例:给定文本,脚本应尝试从Web查找匹配的链接,并从本地磁盘查找文件。两者都只返回链接或路径的列表。
for proc in (web_search, file_search):
results = proc(text)
yield from results
作为解决方案,我需要在执行工作时使用计时器。如果时间超过等待时间,则应将过程移至托盘并要求从那里开始工作。现在,我将进行下一个迭代并重复相同的步骤。循环结束后,我将从移动到托盘的过程中收集结果。
但是我认为,应该有一个更好的方法。 实际上,我在StackOverflow中搜索了此类问题,但找不到类似的内容,因此我不介意将其标记为重复的^^
答案 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
一起使用。