[英]Python: Non-Responsive multiprocessing.pool.map_async() function
我这里有一个奇怪的问题。
我有一个python程序,该程序执行保存在单独的.py文件中的代码,这些文件设计为依次执行。 这些代码可以正常工作,但是它们花费的时间太长。 我的计划是使用execfile()作为函数,文件名作为参数,使用multiprocessing.pool.map_async(function,arguments)在4个处理器之间拆分处理每个.py文件。
因此,无论如何,当我运行代码时,根本没有任何反应, 甚至没有错误 。
看一下,看看是否可以帮帮我,我在SeqFile.runner(SeqFile.file)中运行该文件。
class FileRunner:
def __init__(self, file):
self.file = file
def runner(self, file):
self.run = pool.map_async(execfile, file)
SeqFile = FileRunner("/Users/haysb/Dropbox/Stuart/Sample_proteins/Code/SVS_CodeParts/SequencePickler.py")
VolFile = FileRunner("/Users/haysb/Dropbox/Stuart/Sample_proteins/Code/SVS_CodeParts/VolumePickler.py")
CWFile = FileRunner("/Users/haysb/Dropbox/Stuart/Sample_proteins/Code/SVS_CodeParts/Combine_and_Write.py")
(SeqFile.runner(SeqFile.file))
您这里有几个问题-我猜您以前从未使用过多multiprocessing
。
您的问题之一是您触发了异步操作,但从未等待其结束。 如果您确实等待它结束,则会获得更多信息。 例如,添加:
result = SeqFile.run.get()
这样做,您将看到子进程中引发的异常:您正在将execfile
映射到绑定到file
的字符串上,因此execfile
一次只能看到一个字符。 execfile
barfs尝试执行的第一件事是(实际上):
execfile("/")
apply_async()
会更有意义,或者map_async()
传递了要运行的所有文件的列表。
等等-这很乏味;-)
让我们在这里摆脱不相关的内容,并显示一个完整的可执行程序。 我有三个文件a.py
, b.py
和c.py
这是a.py
:
print "I'm A!"
另外两个是明显的变化。
这是我的整个驱动程序:
if __name__ == "__main__":
import multiprocessing as mp
files = ["a.py", "b.py", "c.py"]
pool = mp.Pool(2)
pool.imap_unordered(execfile, files)
pool.close()
pool.join()
这就是全部内容,并打印(一些排列):
I'm A!
I'm B!
I'm C!
imap_unordered()
在工作进程之间拆分文件列表,并且不在乎(“无序”)运行顺序。这是最大的效率。 请注意,我将工作程序的数量限制为2,只是为了证明它可以正常工作,即使文件(3)比工作程序进程(2)多。
您可以使任何Pool
功能类似地工作。 例如,如果您具有 ;-)来使用map_async()
,则将imap_unordered()
调用替换为:
async = pool.map_async(execfile, files)
async.get()
要么:
asyncs = [pool.apply_async(execfile, (fn,)) for fn in files]
for a in asyncs:
a.get()
更清晰? 首先,使其尽可能简单。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.