Python 由一个进程更改并影响其他进程的全局布尔值
我有两个进程具有相同的布尔值。此布尔值上的更改对其他进程没有影响Python 由一个进程更改并影响其他进程的全局布尔值,python,python-3.x,multiprocessing,python-multiprocessing,Python,Python 3.x,Multiprocessing,Python Multiprocessing,我有两个进程具有相同的布尔值。此布尔值上的更改对其他进程没有影响 def func1():#用于更改布尔值的函数 全球布尔瓦尔 如果(布尔瓦尔) 布尔瓦尔=假 ... def func1():#函数对frm func1的更改没有影响 全球布尔瓦尔 如果(布尔瓦尔) ... boolVar=True#在“if uuuu name uuuuu==”uuuu main uuuuuuuu:”中的var p1=多进程。进程(target=func1,args=(boolVar))#我的进程 p2=多处理。
def func1():#用于更改布尔值的函数
全球布尔瓦尔
如果(布尔瓦尔)
布尔瓦尔=假
...
def func1():#函数对frm func1的更改没有影响
全球布尔瓦尔
如果(布尔瓦尔)
...
boolVar=True#在“if uuuu name uuuuu==”uuuu main uuuuuuuu:”中的var
p1=多进程。进程(target=func1,args=(boolVar))#我的进程
p2=多处理。进程(目标=func2,参数=(布尔瓦尔))
p1.开始()
p2.start()
我需要
func1
的更改影响func2
。如何做到这一点?进程的内存是相互分离的,不是通过Python而是通过操作系统。这样做是出于安全考虑
您需要的是进程间通信。由于您已经使用了多处理
库,请查看
$python3 multi.py
成功了 进程在单独的内存空间中运行,这意味着无法共享全局变量。文档中有一个标题为的部分,讨论了在需要时解决此问题的一些方法 下面是一个可运行的方法,它是按照您问题中的伪代码行应用的。它使用
数组的'i'
作为整数,因为没有一个数组专门用于布尔值-但这没关系,因为在Python中布尔值是int
的子类
请注意,value
共享内存对象的当前值必须通过其value
属性进行访问,如图所示。这是因为它们被实现为具有关联的锁的对象代理,以防止并发访问。必须这样做的开销会显著减少从多处理本身获得的任何收益,具体取决于您正试图做什么
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()
这是正确的答案。尝试在多个进程之间共享内存是一项容易出错且有风险的任务。我同意Thomas的观点,IPC是传递消息的正确方式。我的答案是,如果你想要一个IPC的替代品,那就用一些黑面条吧
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()