即時猜測這是你想要的東西:
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