~~並發編程(九):多線程與多進程~~


進擊のpython

*****

並發編程——多線程與多進程


本小節就一個要求

掌握在一個進程下開啟多個子進程與在一個進程下開啟多個線程的區別

開始操作


開啟速度

在主進程中開啟線程

from threading import Thread


def work():
    print('hello')


if __name__ == '__main__':
    for i in range(10):
        t = Thread(target=work)
        t.start()
    print('主線程/主進程')
        

可以發現執行的很快

在主進程中開啟線進程

from multiprocessing import Process


def func():
    print('我是子進程')
    pass


if __name__ == '__main__':
    for i in range(10):
        p = Process(target=func)
        p.start()
    print('主進程')
    

相比較來說你會發現線程要更快

其實一想也是,開十個進程相當於十個進程+十個線程

那時間上指定要比十個線程要長


pid

在進程里查看pid

import os
from multiprocessing import Process


def func():
    print('我是子進程', os.getpid())
    pass


if __name__ == '__main__':
    for i in range(10):
        p = Process(target=func)
        p.start()
    print('主進程', os.getpid())

我們可以看到,因為是新開的進程,所以每個進程的id都不同

主進程 1516
我是子進程 6800
我是子進程 440
我是子進程 1840
我是子進程 7892
我是子進程 228
我是子進程 6464
我是子進程 4628
我是子進程 4944
我是子進程 4244
我是子進程 2300

在線程里查看pid

import os
from threading import Thread


def func():
    print('我是子進程', os.getpid())
    pass


if __name__ == '__main__':
    for i in range(10):
        p = Thread(target=func)
        p.start()
    print('主進程', os.getpid())

打印結果上可以看出,多線程的開啟時基於一個進程開啟

我是子進程 11228
我是子進程 11228
我是子進程 11228
我是子進程 11228
我是子進程 11228
我是子進程 11228
我是子進程 11228
我是子進程 11228
我是子進程 11228
我是子進程 11228
主進程 11228

數據共享

進程的數據

from multiprocessing import Process


def work():
    global n
    n = 0


if __name__ == '__main__':
    n = 100
    p = Process(target=work)
    p.start()
    p.join()
    print('主', n)

可以看到打印結果是 100

盡管在子進程里對全局變量中的n進行了修改,但是沒有改變主進程里面的數據

所以可以說明,在進程中,數據是不互通的

線程的數據

from threading import Thread


def work():
    global n
    n = 0


if __name__ == '__main__':
    n = 100
    p = Thread(target=work)
    p.start()
    p.join()
    print('主', n)

可以看到打印結果是 0

在子線程里對全局變量中的n進行了修改,改變主進程里面的數據

所以可以說明,在線程中,數據是互通的


*****
*****


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM