Python是最简单的多处理形式
我一直在努力阅读线程和多处理方面的知识,但所有的例子都非常复杂,对于我的python/编程知识水平来说都是高级的。我想运行一个函数,它由一个while循环组成,当该循环运行时,我想继续程序,并最终更改while循环的条件并结束该过程。代码如下:Python是最简单的多处理形式,python,multithreading,multiprocessing,Python,Multithreading,Multiprocessing,我一直在努力阅读线程和多处理方面的知识,但所有的例子都非常复杂,对于我的python/编程知识水平来说都是高级的。我想运行一个函数,它由一个while循环组成,当该循环运行时,我想继续程序,并最终更改while循环的条件并结束该过程。代码如下: class Example(): def __init__(self): self.condition = False def func1(self): self.condition = True
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
I进行以下函数调用:
ex = Example()
ex.func1()
time.sleep(5)
ex.end_loop()
我想让func1在调用end\u loop()
之前运行5秒钟,然后更改条件并结束循环,从而结束函数。也就是说,我希望一个进程启动并“进入”到func1
,同时我希望调用time.sleep(5)
,因此当到达func1
时,进程“分裂”,一个进程进入函数,另一个进程继续向下运行程序并开始执行time.sleep(5)
这一定是多进程最基本的例子了,但我还是很难找到一个简单的方法
多谢各位
编辑1:关于做点什么
。在我真正的问题do_中,某个
被某个代码替换,该代码通过套接字与另一个程序通信,并每隔0.02s接收坐标为的包,并将其存储在类的membervariables中。我希望开始不断更新坐标,然后能够同时通过其他函数读取坐标
然而,这并不重要。如果do\u something
被以下内容取代,该怎么办
time.sleep(1)
print "Still looping"
那么我该如何解决我的问题呢
EDIT2:我尝试过这样的多处理:
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
,然后继续时间。sleep
和ex.end\u loop()
代码的第一个问题是调用
p1 = Process(target=ex.func1())
p2 = Process(target=ex.end_loop())
使用ex.func1()
调用函数并将返回值作为target
参数传递。由于函数不返回任何内容,因此实际上是在调用
p1 = Process(target=None)
p2 = Process(target=None)
当然,这毫无意义
修复后,下一个问题将是共享数据:当使用多处理
包时,您将使用多个进程实现并发,默认情况下,这些进程不能简单地共享数据。请查看软件包的文档,了解这一点。尤其要考虑第一句话:“在进行并发编程时,通常最好尽量避免使用共享状态”
因此,您可能还需要了解如何在两个不同进程之间发送/接收数据。因此,与其简单地设置一个标志来停止循环,不如发送一条消息来通知循环应该终止
还要注意的是,进程是一种重量级的多处理形式,它们产生了多个操作系统进程,这带来了相对较大的开销多处理
的主要目的是避免Python全局解释器锁带来的问题(请通过google了解更多…),如果您的问题没有您告诉我们的复杂得多,您可能希望改用线程
包:线程的开销比进程少,并且还允许访问相同的数据(尽管在执行此操作时您确实应该阅读有关同步的内容…)
恐怕,多重处理是一个天生复杂的课题。因此,我认为您需要提高编程/python技能才能成功地使用它。但我相信您会处理好的,关于这一点的python文档是全面的,并且还有很多其他相关资源 要解决EDIT2问题,可以尝试使用共享内存映射 (注意
args=(cond,)
中的target=ex.func1
不带括号和cond后的逗号)
但是请看MartinStettner提供的答案,以找到一个好的解决方案。请具体说明
做些什么
。请参阅编辑后的问题。我读到,与python多处理相比,python concurrent.futures是处理多线程的一种更简单的方法。然而,我还没有进一步挖掘。也许你可以试一试。
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()