我有一个Python应用程序用于获取一系列数据,并对该集合中的每个数据执行任务。由于存在延迟,因此每个数据都需要逐个执行任务不太理想,我希望它们可以并行处理。在这种情况下,我应该使用多进程还是线程?
我尝试使用线程但遇到了些问题,常常会出现某些任务无法正常启动。
我尝试使用线程但遇到了些问题,常常会出现某些任务无法正常启动。
任务运行起来像是顺序执行,但你会有一种错觉,认为它们是并行执行的。任务在处理文件或连接I/O时非常有效,并且因为它们是轻量级的。
使用进程池进行多进程可能是正确的解决方案,因为进程并行运行,所以在处理密集计算时非常有效,因为每个进程在一个CPU(或核心)上运行。
设置多进程可能非常容易:
from multiprocessing import Pool
def worker(input_item):
output = do_some_work()
return output
pool = Pool() # it make one process for each CPU (or core) of your PC. Use "Pool(4)" to force to use 4 processes, for example.
list_of_results = pool.map(worker, input_list) # Launch all automatically
stackless.schedule()
(让出给下一个协程),或者设置Stackless为抢占式多任务处理。使用CPython的线程模型不会给您带来任何性能提升,因为由于垃圾回收的处理方式,线程实际上并没有并行执行。多进程可以允许并行执行。显然,在这种情况下,您必须有多个可用的核心来分配并行作业。
此相关问题中提供了更多信息。
IronPython具有真正的多线程功能,不像CPython和它的GIL。因此,根据您正在做什么,它可能值得一看。但是听起来您的用例更适合使用多处理模块。
对于推荐stackless python的人,我不是它的专家,但在我看来,他谈论的是软件“多线程”,实际上根本不是并行的(仍在一个物理线程中运行,因此无法扩展到多个核心)。这只是一种替代的方式来构建异步(但仍然是单线程的,非并行的)应用程序。