2015-10-20 43 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她喜欢分享。