Python最简单的多处理形式

时间:2014-08-21 07:10:07

标签: python multithreading multiprocessing

我一直在尝试阅读线程和多处理,但所有的例子都是为了我的python / programming knowlegde的复杂和高级。我想运行一个函数,它包含一个while循环,当循环运行时,我想继续该程序并最终改变while循环的条件并结束该过程。这是代码:

class Example():

    def __init__(self):
        self.condition = False

    def func1(self):
        self.condition = True
        while self.condition:
            print "Still looping"
            time.sleep(1)
        print "Finished loop"

    def end_loop(self):
        self.condition = False

我做了以下函数调用:

ex = Example()
ex.func1()
time.sleep(5)
ex.end_loop()

我想要的是func1在调用end_loop()之前运行5s并改变条件并结束循环,从而也结束函数。即我想要一个进程启动并“进入”func1 并同时我希望time.sleep(5)被调用,因此进程“分裂”到达{ {1}},一个进程进入该函数,而另一个进程继续执行该程序并以func1执行开始。

这一定是多进程的最基本的例子,我仍然无法找到一种简单的方法来做到这一点!

谢谢

EDIT1:关于time.sleep(5)。在我的实际问题中,do_something被一些代码替换,这些代码通过套接字与另一个程序通信,并接收每0.02s坐标的包,并将它们存储在类的成员变量中。我想要不断更新坐标,然后才能通过其他功能同时读取坐标。

然而,这并不那么重要。如果do_something被替换为:

,该怎么办?
do_something

我如何解决我的问题?

EDIT2:我尝试过像这样的多处理:

time.sleep(1)
print "Still looping"

当我跑步时,我从未到过from multiprocessing import Process ex = Example() p1 = Process(target=ex.func1()) p2 = Process(target=ex.end_loop()) p1.start() time.sleep(5) p2.start() ,所以这没有帮助。即使它有这个也不是我想要的。我想要的只是启动流程p2.start(),然后继续p1time.sleep

2 个答案:

答案 0 :(得分:1)

您的代码的第一个问题是调用

p1 = Process(target=ex.func1())
p2 = Process(target=ex.end_loop())

使用ex.func1()调用函数并将返回值作为target参数传递。由于该函数不返回任何内容,因此您正在有效地调用

p1 = Process(target=None)
p2 = Process(target=None)

这当然没有意义。

修复之后,下一个问题将是共享数据:使用multiprocessing包时,使用多个进程实现并发,默认情况下,不能简单地分享数据。请查看软件包文档中的Sharing state between processes以了解相关信息。特别是考虑第一句话:“在进行并发编程时,通常最好尽量避免使用共享状态”!

因此,您可能还需要查看Exchanging objects between processes,了解如何在两个不同进程之间发送/接收数据。因此,不是简单地设置一个标志来停止循环,而是发送消息以表示循环终止应该更好。

另请注意,进程是多重处理的重量级形式,它们会产生多个操作系统进程,这会带来相对较大的开销。 multiprocessing的主要目的是避免Python的全局解释器锁所带来的问题(谷歌关于此更多...阅读更多...)如果您的问题并不比您的问题复杂得多ve告诉我们,您可能希望使用threading包:线程的开销比进程少,并且允许访问相同的数据(尽管您在执行操作时确实应该阅读 synchronization 此...)

我担心,多处理是一个固有的复杂主题。所以我认为你需要提高你的编程/ python技能才能成功使用它。但我相信你会管理这个,关于这个的python文档很全面,还有很多其他资源。

答案 1 :(得分:0)

要解决您的EDIT2问题,您可以尝试使用共享内存映射Value

import time
from multiprocessing import Process, Value

class Example():

  def func1(self, cond):
    while (cond.value == 1):
      print('do something')
      time.sleep(1)
    return

if __name__ == '__main__':

  ex = Example()
  cond = Value('i', 1)
  proc = Process(target=ex.func1, args=(cond,))

  proc.start()
  time.sleep(5)
  cond.value = 0
  proc.join()

(请注意target=ex.func1没有括号,而{c}后的逗号位于args=(cond,)

但是看看MartinStettner提供的答案,找到一个好的解决方案。