2015-10-20 46 views
0

我有一個相當簡單的程序,我正在寫python,因爲某些原因不起作用。它將輸出「連接」行上方的打印語句,但不包括其後的任何內容,包括更改內容。爲什麼?簡單的多線程在Python中使用進程

from multiprocessing import Process 
import time 

x = 0 

def main(): 
    global x 
    p = Process(target=change) 
    p.start() 
    print(x) 
    p.join() 
    # time.sleep(5) 


def change(): 
    global x 
    x = x +1 
    print(x) 


if __name__ == '__main__': 
    main() 
+1

那些不是線程,它們是進程。每個進程都有自己獨立的內存,並擁有自己的x專用副本。 – Kevin

+0

不應該共享一個全球X?無論哪種方式,更改不會運行。 – Reid

+2

當我運行你的代碼時,這打印得很好。 – dopstar

回答

1

即時猜測這是你想要的東西:

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她喜歡分享。