Rya*_*yan 32 python multithreading multiprocess
我有一个python应用程序,它抓取数据集合,对于该集合中的每个数据,它执行一项任务.由于涉及延迟,该任务需要一些时间才能完成.由于这种延迟,我不希望每个数据随后执行任务,我希望它们全部并行发生.我应该使用多进程吗?或操作线程?
我试图使用线程,但遇到了一些麻烦,通常一些任务实际上永远不会触发.
Chr*_*her 30
如果您真正受计算限制,使用多处理模块可能是最轻量级的解决方案(就内存消耗和实现难度而言).
如果您受I/O限制,使用线程模块通常会给您带来良好的结果.确保使用线程安全存储(如队列)将数据传递给线程.或者,当它们产生时,将它们交给他们独有的单个数据.
PyPy专注于性能.它具有许多可以帮助进行计算绑定处理的功能.他们也支持软件事务内存,尽管这还不是生产质量.承诺是您可以使用比多处理更简单的并行或并发机制(这有一些尴尬的要求.)
Stackless Python也是一个不错的主意.如上所述,Stackless具有可移植性问题.Unladen Swallow很有希望,但现在已经不复存在了.Pyston是另一个(未完成的)Python实现,专注于速度.它采用的方法与PyPy不同,可能会产生更好(或者只是不同)的加速.
任务按顺序运行,但您有并行运行的错觉.当您使用文件或连接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
Run Code Online (Sandbox Code Playgroud)
对于小型数据集合,只需使用subprocess.Popen创建子进程.
每个子进程可以简单地从stdin或命令行参数获取它的数据,进行处理,并简单地将结果写入输出文件.
当子进程全部完成(或超时)时,您只需合并输出文件.
非常简单.
你可以考虑研究Stackless Python.如果你可以控制需要很长时间的函数,你可以stackless.schedule()
在那里抛出一些(说到下一个协程的产量),否则你可以将Stackless设置为抢占式多任务处理.
在无堆栈,你没有线程,但任务蕾或greenlets本质上属于非常轻量级线程.它的效果非常好,因为它有一个非常好的框架,只需很少的设置即可实现多任务处理.
但是,Stackless阻碍了可移植性,因为你必须替换一些标准的Python库 - Stackless消除了对C栈的依赖.如果下一个用户也安装了Stackless,那么它非常便携,但很少会出现这种情况.
归档时间: |
|
查看次数: |
18029 次 |
最近记录: |