Multithreading 我应该在这里使用协同程序还是其他调度对象?
我目前有一个生成器形式的代码,它调用IO绑定的任务。生成器实际上也调用子生成器,因此更通用的解决方案将受到欢迎 如下所示:Multithreading 我应该在这里使用协同程序还是其他调度对象?,multithreading,python-3.x,parallel-processing,generator,coroutine,Multithreading,Python 3.x,Parallel Processing,Generator,Coroutine,我目前有一个生成器形式的代码,它调用IO绑定的任务。生成器实际上也调用子生成器,因此更通用的解决方案将受到欢迎 如下所示: def processed_values(list_of_io_tasks): for task in list_of_io_tasks: value = slow_io_call(task) yield postprocess(value) # in real version, would iterate over
def processed_values(list_of_io_tasks):
for task in list_of_io_tasks:
value = slow_io_call(task)
yield postprocess(value) # in real version, would iterate over
# processed_values2(value) here
我完全可以控制慢速io_调用
,我不在乎从处理的值中获取项目的顺序。通过将slow\u io\u call
转换为异步函数并使用返回速度最快的调用,我是否可以使用类似于协同路由的方法以最快的顺序获得生成的结果?我希望任务列表至少有数千个条目。除了显式线程之外,我从未做过任何并行工作,尤其是我从未使用过各种形式的轻量级线程
我需要使用标准的CPython实现,并且我正在Linux上运行。听起来像是在搜索,特别是方法
这里是函数的一个端口,用于使用imap_unordered()并行化调用以减慢_io_call()
请注意,您也可以直接迭代结果
(即,对于结果中的项:yield item
),而不使用,而使用True
循环,但是调用结果。next()带有超时值的
可以解决这一问题,并允许您使用Ctrl-C终止主进程和所有子进程。还要注意的是,此函数中不会捕获StopIteration异常,但在结果时会引发一个异常。next()
不再返回任何项。这在生成器函数中是合法的,比如这个函数,当没有更多的值要生成时,它会引发StopIteration错误,或者只是停止生成,并且会代表它引发StopIteration异常
要使用线程代替进程,请替换导入多处理
与
import multiprocessing.dummy as multiprocessing
啊,问题在于慢io_调用源于python外部,可能需要一段时间才能返回——添加尽可能多的已进入慢io_调用的实例会更好,因为我可以发出我想要的任意多个并发请求(例如:查询分布式客户端的信息,结合硬盘写入,其中请求的数量不会显著影响任何请求的响应时间)。虽然没有文档记录,但我假设一个进程池最多进入迭代器4次,然后进行竞争,而不是暂停并进入下一个迭代步骤?尝试增加池大小,比较进程池和线程池,以找到适用于您的应用程序的最佳解决方案,这始终是相对加速和增量之间的平衡从头顶掠过。
def processed_values(list_of_io_tasks):
pool = multiprocessing.Pool(4) # num workers
results = pool.imap_unordered(slow_io_call, list_of_io_tasks)
while True:
yield results.next(9999999) # large time-out