python 多程序 之 join

2021-09-04 11:00:13 字數 2053 閱讀 3553

今天一大早起床, 又學三個臭函式, 記錄一下自己渺小微弱的學習之路

有時候join()我們是用來連線字串的, 但就在今天我學習程序的時候, 看見join(), 居然不是用來連線字串了, 而是用來阻塞程序, 興趣大增, 便深入了解了一下,

join()的作用:在程序中可以阻塞主程序的執行, 直到等待子執行緒全部完成之後, 才繼續執行主線程後面的**

我們先來看下面的**, 這段**沒有使用join()

**段a

import threading

import time

def test(num):

time.sleep(1)

print(num)

#定義乙個用來裝子執行緒的列表

threads =

for i in range(5):

#target 指定子執行緒要執行的funtion, args 指定該funtion需要傳入的引數

thread = threading.thread(target = test, args = [i])

#上面的 thread 是乙個個引數i都不同的執行緒, 現在把它乙個個裝進列表 threads 裡面

for i in tsreads:

#for 迴圈執行 threads 列表裡面的全部執行緒, 沒有用 join()執行緒是無序執行的,

# 就連最後一句print('end')可能比所有子執行緒都要先執行

i.start()

print('end')

執行結果,可以看出主線程先執行完, 完全沒有等待子執行緒全部執行完之後再執行,而且子執行緒都是無序執行完畢的

我們再來看下面的**, 這段**段a的基礎上在i.start()的後面多新增一條i.join()

for i in tsreads:

i.start()

i.join()

執行結果,可以看到主線程最後一句print('end')等待到了所有子執行緒都完成之後在執行了, 因為i.join()的出現阻塞了主線程的執行, 等待所有子執行緒執行完畢再執行. 而且所有的子執行緒都是乙個接乙個地執行, 等待到本子執行緒執行完畢之後, 在執行下乙個

我們再來看下面的**, 這段**段a的基礎上在for i in rangs(5):的後面多新增一條for i in threads:

for i in tsreads:

i.start()

for i in threads:

i.join()

執行結果在這裡看一看出來, join()還是阻擋了主線程的執行, 讓所有的子執行緒執行完畢之後再執行, 而且前面的子執行緒的執行都是無序地執行完畢了

大家可以改一下程式的**, 利用start_time = time.time()來觀察一下加或不加join() 之後的執行效率, 在我執行的時候, 上面第二種**會執行效率比較低, 耗時5秒, 因為每執行乙個子執行緒會time.sleep(1)秒鐘, 在第一和第三種情況沒有 join()的阻塞, **會更快執行完, 大概也就1或2秒吧. 這就有關非同步之類的問題了, 我會在之後接著學習.

知識要一點一點積累,

咦??我打下這9個字的時候想是怎麼回事???

python多程序之程序池

在利用python進行系統管理的時候,特別是同時操作多個檔案目錄,或者遠端控制多台主機,並行操作可以節約大量的時間。當被操作物件數目不大時,可以直接利用multiprocessing中的process動態成生多個程序,十幾個還好,但如果是上百個,上千個目標,手動的去限制程序數量卻又太過繁瑣,此時可以...

python多程序之multiprocessing

簡單的理解 單板上執行的乙個程式就是乙個程序。程序是作業系統分配資源的最小單位,不同的程序之間資源不共享,程序間通訊需要使用特定的方式。python提供了自帶的multiprocessing庫,用於多執行緒場景。import multiprocessing import time defworker...

Python多程序之Queue管道

from multiprocessing import process,queue 匯入程序的佇列模組,跟執行緒裡的是不一樣 deff q q.put 42,none,hello q.put test if name main 生成乙個佇列,然後將佇列傳給子程序,然後父程序就可以訪問這個子程序操作後...