我一直在尝试阅读线程和多处理,但所有的例子都是为了我的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()
,然后继续p1
和time.sleep
答案 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提供的答案,找到一个好的解决方案。