進擊の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進行了修改,改變主進程里面的數據
所以可以說明,在線程中,數據是互通的