所以,我已经玩了几天的Python multiprocessing
模块了,而且还有我无法理解的东西。也许有人可以给我一些帮助。
我试图同时从同一个班级运行两个方法,但显然我缺少了一些东西:
from multiprocessing import Process
import time
class SomeClass:
def __init__(self):
pass
def meth1(self):
print(1)
time.sleep(10)
def meth2(self):
print(2)
time.sleep(5 * 60)
def main():
while True:
s = SomeClass()
p1 = Process(target=s.meth1) # I want this to run from 10 to 10 seconds
p1.start()
p2 = Process(target=s.meth2) # I want this to run from 5 to 5 minutes
# while the first one still does its own
# job from 10s to 10s
p2.start()
p1.join()
p2.join()
if __name__ == '__main__':
main()
我期望发生的事情是:
1
; 2
(不等待10秒 - 这确实发生并且似乎按预期工作); 我错过了什么?为什么第二步按预期工作,但第三步没有?我怎样才能使它发挥作用?
答案 0 :(得分:1)
将流程视为您的朋友/克隆,您可以通过电话拨打,进来做某事,然后当他们全部完成后,他们会回家,给你留言。
行:
p1 = Process(target=s.meth1)
p1.start()
调用一个克隆并让他运行s.meth1
。他走了过来,在屏幕上打印1,等待10秒,然后给你留言:“一切都完成了,没有例外,我已经回家了。”
同时(当你的第一个克隆过来时),行:
p2 = Process(target=s.meth2)
p2.start()
调出另一个克隆并让他运行s.meth2
。他走了过来,在屏幕上打印2张,等了5分钟,然后给你留言:“一切都完成了,没有例外,我已经回家了。”
当克隆#1和#2正在开展工作时,行:
p1.join()
等待克隆#1给你留言。这发生在10秒后。然后你继续:
p2.join()
等待克隆#2给你留言。再过4分50秒就会发生这种情况。然后你回到你的while True
并重新开始一切。
如果您希望不等待克隆#2完成并留下他的笔记,请不要再调用p2.join()
。但最终,你应该打电话给p2.join()
以确保一切顺利,并且他成功回家了,并没有在你的客厅里躺在血泊中,射击除了一些例外。 : - )
答案 1 :(得分:1)
很难真正知道你想要什么,但是下面这段代码就是你所描述的,但没有方便的退出方式:
from multiprocessing import Process
import time
class SomeClass:
def __init__(self):
pass
def meth1(self):
while True:
print(1)
time.sleep(10)
def meth2(self):
while True:
print(2)
time.sleep(5 * 60)
def main():
s = SomeClass()
p1 = Process(target=s.meth1) # I want this to run from 10 to 10 seconds
p1.start()
p2 = Process(target=s.meth2) # I want this to run from 5 to 5 minutes while the first one still does its own job from 10s to 10s
p2.start()
p1.join()
p2.join()
if __name__ == '__main__':
main()
我已将while
移到SomeClass
此代码永远不会退出,挂在p1.join()