处理多处理和睡眠的推荐方法是什么?

时间:2018-01-02 19:11:48

标签: python python-3.x multiprocessing

所以,我已经玩了几天的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秒 - 这确实发生并且似乎按预期工作);
  • 然后我会在接下来的4分钟和50分钟内看到只有1秒(这不会发生,而且等待程序通过。

我错过了什么?为什么第二步按预期工作,但第三步没有?我怎样才能使它发挥作用?

2 个答案:

答案 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()