Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python是最简单的多处理形式_Python_Multithreading_Multiprocessing - Fatal编程技术网

Python是最简单的多处理形式

Python是最简单的多处理形式,python,multithreading,multiprocessing,Python,Multithreading,Multiprocessing,我一直在努力阅读线程和多处理方面的知识,但所有的例子都非常复杂,对于我的python/编程知识水平来说都是高级的。我想运行一个函数,它由一个while循环组成,当该循环运行时,我想继续程序,并最终更改while循环的条件并结束该过程。代码如下: class Example(): def __init__(self): self.condition = False def func1(self): self.condition = True

我一直在努力阅读线程和多处理方面的知识,但所有的例子都非常复杂,对于我的python/编程知识水平来说都是高级的。我想运行一个函数,它由一个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
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()