我有一个程序需要创建几个图表,每个图表通常需要几个小时。因此,我想在不同的内核上同时运行这些内容,但似乎无法使用// @flow
type Foo = {|
foo: string
|}
function test(foo: Foo) {
if (foo.bar) {
console.log("WTF?")
}
}
模块运行这些进程。这是我的代码:
multiprocessing
(if __name__ == '__main__':
jobs = []
for i in range(5):
p = multiprocessing.Process(target=full_graph)
jobs.append(p)
p.start()
p.join()
已经在程序的早期定义,并且只是一个运行其他函数集合的函数)
该功能通常会输出一些图形,并将数据保存到.txt文件中。所有数据都保存到相同的2个文本文件中。但是,使用上面的代码调用函数不会给出控制台输出,也不会给文本文件输出任何内容。所有这一切都是几秒钟的暂停,然后程序退出。
我正在使用带有WinPython 3.6.3的Spyder IDE
答案 0 :(得分:1)
如果没有简单的full_graph
样本,没有人可以告诉您发生了什么。但是你的代码本质上是错误的。
if __name__ == '__main__':
jobs = []
for i in range(5):
p = multiprocessing.Process(target=full_graph)
jobs.append(p)
p.start()
p.join() # <- This would block until p is done
查看p.join()
之后的评论。如果您的流程确实需要数小时才能完成,那么您将运行一个流程数小时,然后运行第二个,第三个流程。系列地使用单核。
来自文档:https://docs.python.org/3/library/multiprocessing.html
Process.join
:https://docs.python.org/3/library/multiprocessing.html#multiprocessing.Process.join
如果可选参数timeout为None(缺省值),则该方法将阻塞,直到调用其join()方法的进程终止。如果timeout是一个正数,它最多会阻塞超时秒。请注意,如果方法的进程终止或方法超时,则该方法返回None。检查进程的exitcode以确定它是否终止。
如果每个流程都有不同之处,那么您应该为args
提供一些full_graph
(提示:这可能是缺失的因素吗?)
您可能希望使用map
Pool
这样的界面
并且(再次从文档中)
from multiprocessing import Pool
def f(x):
return x*x
if __name__ == '__main__':
with Pool(5) as p:
print(p.map(f, [1, 2, 3]))