我有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
的更改。我该怎么做?
过程的内存彼此分开,而不是由Python而不是操作系统分开。这是出于安全原因。
您需要的内容称为解释性通信。由于您已经使用了multiprocessing
库,请查看使用管道传递的消息
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
工作!
流程在单独的内存空间中运行,这意味着无法共享全局变量。该文档具有标题为"共享状态"的部分,该过程在需要时讨论了一些围绕此方法的方法。
这是您问题中按照伪代码线应用的这些方法。它为整数使用'i'
的array
类型代码,因为没有专门针对布尔值的代码 - 但这没关系,因为在Python Boolean中是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()