即时猜测这是你想要的东西:
from threading import Lock, Thread
x = 0
lock = Lock()
def main():
global x
print(x)
p = Thread(target=change, args=(1,))
p2 = Thread(target=change, args=(2,))
p.start()
p2.start()
p.join()
p2.join()
def change(number):
global x
with lock:
x = x + 1
print('{} - coming from process #{}'.format(x, number))
if __name__ == '__main__':
main()
输出:
0
1 - coming from process #1
2 - coming from process #2
这一点,你会发现行不通:
from multiprocessing import Process
from threading import Lock
x = 0
lock = Lock()
def main():
global x
print(x)
p = Process(target=change, args=(1,))
p2 = Process(target=change, args=(2,))
p.start()
p2.start()
p.join()
p2.join()
def change(number):
global x
with lock:
x = x + 1
print('{} - coming from process #{}'.format(x, number))
if __name__ == '__main__':
main()
输出:
0
1 - coming from process #1
1 - coming from process #2
那是因为Process
就像你的exwife--她不在乎你,在上次看到它时会保留100%的东西。所以它的第一个0,它将复制0
,并且不会再看x
。不像Thread
她喜欢分享。
那些不是线程,它们是进程。每个进程都有自己独立的内存,并拥有自己的x专用副本。 – Kevin
不应该共享一个全球X?无论哪种方式,更改不会运行。 – Reid
当我运行你的代码时,这打印得很好。 – dopstar