python 多線程中join()的作用
一 前言
溫習(xí)python 多進(jìn)程語法的時候,對 join的理解不是很透徹,本文通過代碼實(shí)踐來加深對 join()的認(rèn)識。
multiprocessing 是python提供的跨平臺版本的多進(jìn)程模塊。multiprocessing可以充分利用多核,提升程序運(yùn)行效率。multiprocessing支持子進(jìn)程,通信和共享數(shù)據(jù),執(zhí)行不同形式的同步,提供了Process、Queue、Pipe、Lock等組件。不過今天重點(diǎn)了解 join。后續(xù)文章會逐步學(xué)習(xí)介紹其他組件或者功能。
二 動手實(shí)踐
join()方法可以在當(dāng)前位置阻塞主進(jìn)程,帶執(zhí)行join()的進(jìn)程結(jié)束后再繼續(xù)執(zhí)行主進(jìn)程的代碼邏輯。
# encoding: utf-8
"""
author: yangyi@youzan.com
time: 2019/7/30 11:20 AM
func:
"""
from multiprocessing import Process
import os
import time
def now():
return str(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()))
def func_1(name):
print(now() + ' Run child process %s (%s)...' % (name, os.getpid()))
time.sleep(4)
print(now() + ' Stop child process %s (%s)...\n' % (name, os.getpid()))
def func_2(name):
print(now() + ' Run child process %s (%s)...' % (name, os.getpid()))
time.sleep(8)
print(now() + ' hello world!')
print(now() + ' Stop child process %s (%s)...\n' % (name, os.getpid()))
if __name__ == '__main__':
print ('Parent process %s.' % os.getpid())
p1 = Process(target=func_1, args=('func_1',))
p2 = Process(target=func_2, args=('func_2',))
print now() + ' Process start.'
p1.start()
p2.start()
p1.join()
p2.join()
print now() + ' Process end .'
輸出結(jié)果

結(jié)果顯示
主進(jìn)程的 Process end .是在func1 和func2 結(jié)束之后才打印出來的。
2.2 去掉 join() 函數(shù)
if __name__ == '__main__':
print ('Parent process %s.' % os.getpid())
p1 = Process(target=func_1, args=('func_1',))
p2 = Process(target=func_2, args=('func_2',))
print now() + ' Process start.'
p1.start()
p2.start()
print now() + ' Process end .'
結(jié)果如下:

2.3 去掉func_2 的 join()
if __name__ == '__main__':
print ('Parent process %s.' % os.getpid())
p1 = Process(target=func_1, args=('func_1',))
p2 = Process(target=func_2, args=('func_2',))
print now() + ' Process start.'
p1.start()
p2.start()
p1.join() ### 在p1 執(zhí)行完之后 。不等待p2 執(zhí)行,主進(jìn)程結(jié)束。
print now() + ' Process end .'
結(jié)果如下:

結(jié)果顯示主線程 "Process end"在func_1 執(zhí)行結(jié)束之后輸出而沒有等待func_2 執(zhí)行完畢。
2.4 小結(jié)
利用多線程時,一般都先讓子線程調(diào)用start() ,然后再去調(diào)用join(),讓主進(jìn)程等待子進(jìn)程結(jié)束才繼續(xù)走后續(xù)的邏輯。
思考題
能不能每個子進(jìn)程調(diào)用start() 之后,然后直接調(diào)用join() 類似:
p1.start()p1.join()p2.start()p2.join()
以上就是python 多線程中join()的作用的詳細(xì)內(nèi)容,更多關(guān)于python 多線程join()的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python實(shí)現(xiàn)隨機(jī)游走的詳細(xì)解釋
這篇文章主要介紹了Python實(shí)現(xiàn)隨機(jī)游走的詳細(xì)解釋,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
Python列表(List)知識點(diǎn)總結(jié)
在本篇文章中小編給大家分享了關(guān)于Python列表(List)知識點(diǎn)一直對應(yīng)的實(shí)例內(nèi)容,需要的朋友們學(xué)習(xí)下。2019-02-02
詳解python tkinter包獲取本地絕對路徑(以獲取圖片并展示)
這篇文章主要給大家介紹了關(guān)于python tkinter包獲取本地絕對路徑(以獲取圖片并展示)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
Django DRF APIView源碼運(yùn)行流程詳解
這篇文章主要介紹了Django DRF APIView源碼運(yùn)行流程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-08-08
python 如何在list中找Topk的數(shù)值和索引
這篇文章主要介紹了python 如何在list中找Topk的數(shù)值和索引的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-05-05
python運(yùn)用pygame庫實(shí)現(xiàn)雙人彈球小游戲
這篇文章主要為大家詳細(xì)介紹了python運(yùn)用pygame庫實(shí)現(xiàn)雙人彈球小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-11-11
Python設(shè)計模式之建造者模式實(shí)例詳解
這篇文章主要介紹了Python設(shè)計模式之建造者模式,簡單說明了建造者模式的概念、原理,并結(jié)合實(shí)例形式分析了Python定義及使用建造者模式相關(guān)操作技巧,需要的朋友可以參考下2019-01-01

