我有2个具有相同布尔值的进程。此布尔值的更改不会影响其他进程。
def func1(): # function wich changes the boolean
global boolVar
if(boolVar)
boolVar = False
...
def func1(): # function wich have no effect on the change frm func1
global boolVar
if(boolVar)
...
boolVar = True # var in " if __name__ == "__main__": "
p1 = multiprocessing.Process(target=func1, args=(boolVar)) #my processes
p2 = multiprocessing.Process(target=func2, args=(boolVar))
p1.start()
p2.start()
我需要func1
对func2
的影响。我该怎么办?
答案 0 :(得分:2)
进程的内存不是通过Python而是通过操作系统彼此分离。出于安全原因这样做。
您所需要的称为进程间通信。由于您已经使用了multiprocessing
库,因此请查看message passing with pipes
答案 1 :(得分:0)
import multiprocessing
boolVar=False
def func1(_bool): # function wich changes the boolean
global boolVar
if not boolVar:
boolVar = True
def func2(): # function wich have no efffect on the change frm func1
global boolVar
if boolVar:
print('worked!')
boolVar = True # var in " if __name__ == "__main__": "
p1 = multiprocessing.Process(target=func1, args=(boolVar,)) #my processes
p2 = multiprocessing.Process(target=func2)
p1.start()
p2.start()
$ python3 multi.py
工作了!
答案 2 :(得分:0)
进程在单独的内存空间中运行,这意味着无法共享全局变量。该文档的标题为Sharing state between processes的部分讨论了在需要时解决此问题的一些方法。
在您的问题中,这是伪代码中适用的一种可运行方式。它使用array
中的'i'
type code来表示整数,因为没有一个专门用于布尔值的值,但是没关系,因为在Python中,布尔值是int
的子类。
请注意,Value
共享内存对象的当前值必须通过其value
属性访问,如图所示。这是因为它们被实现为具有关联的Lock
的对象代理,以防止并发访问。这样做的开销会大大减少从多处理本身获得的任何收益,具体取决于您要尝试执行的操作。
import multiprocessing
import time
def func1(boolVar):
if boolVar.value:
boolVar.value = False
def func2(boolVar):
time.sleep(1) # For testing, give other process time to execute.
print(bool(boolVar.value)) # Show current "truthiness".
if __name__ == '__main__':
boolVar = multiprocessing.Value('i', True) # Create value in shared memory.
p1 = multiprocessing.Process(target=func1, args=(boolVar,))
p2 = multiprocessing.Process(target=func2, args=(boolVar,))
p1.start()
p2.start()
p1.join()
p2.join()