所以,我已经玩了几天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 秒 - 这确实发生了并且似乎按预期工作); - 然后我应该在接下来的 1 分钟和 50 分钟内只看到 50s(这没有发生,程序只是等待那个时间过去。
我错过了什么?为什么第二步按预期工作,而第三步却没有?我怎样才能让它工作?
很难真正知道你想要什么,但是下面的这段代码会按照您的描述进行操作,但没有方便的退出方式:
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()
将进程视为您的朋友/克隆,您可以通过电话拨打它们,进来做某事,然后当它们全部完成后,它们会回家,给您留一张便条。
台词:
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()
,以确保一切顺利,他成功地回家了,而不是躺在你的客厅里血泊中,被某个例外枪杀。:-)