欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python實(shí)現(xiàn)守護(hù)進(jìn)程、守護(hù)線程、守護(hù)非守護(hù)并行

 更新時(shí)間:2018年05月05日 17:07:04   作者:Saflyer  
本篇文章主要介紹了python實(shí)現(xiàn)守護(hù)進(jìn)程、守護(hù)線程、守護(hù)非守護(hù)并行,詳細(xì)的介紹了守護(hù)子進(jìn)程、非守護(hù)子進(jìn)程并存,守護(hù)子線程非守護(hù)子進(jìn)程并存的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

守護(hù)進(jìn)程

1、守護(hù)子進(jìn)程

主進(jìn)程創(chuàng)建守護(hù)進(jìn)程

  1. 其一:守護(hù)進(jìn)程會(huì)在主進(jìn)程代碼執(zhí)行結(jié)束后就終止
  2. 其二:守護(hù)進(jìn)程內(nèi)無(wú)法再開啟子進(jìn)程,否則拋出異常:AssertionError: daemonic processes are not allowed to havechildren

注意:進(jìn)程之間是互相獨(dú)立的,主進(jìn)程代碼運(yùn)行結(jié)束,守護(hù)進(jìn)程隨即終止

我們來(lái)看一個(gè)例子

from multiprocessing import Process
import os,time,random

def task():
  print('%s is running' %os.getpid())
  time.sleep(2)
  print('%s is done' %os.getpid())

  #守護(hù)進(jìn)程內(nèi)無(wú)法再開啟子進(jìn)程,否則拋出異常
  # p = Process(target=time.sleep, args=(3,))
  # p.start()

if __name__ == '__main__':
  p=Process(target=task)
  p.daemon = True #1、必須在p.start()之前
  p.start()
  print('主')

輸出結(jié)果如下:

原因是:主進(jìn)程程序啟動(dòng)執(zhí)行到p子進(jìn)程,由于子進(jìn)程需要開辟內(nèi)存空間,由于需要耗費(fèi)時(shí)間,所以主進(jìn)程會(huì)首先輸出“主”,由于主進(jìn)程執(zhí)行完畢,那么守護(hù)子進(jìn)程p也就被干掉了,隨之主進(jìn)程也就退出了

如果上面代碼修改如下,加上 p.join()這一行代碼

if __name__ == '__main__':
  p=Process(target=task)
  p.daemon = True #1、必須在p.start()之前
  p.start()
  p.join()
  print('主')

那么程序會(huì)輸出如下:

14732 is running

14732 is done

join以前也分析過(guò),是起到阻塞作用,子進(jìn)程執(zhí)行完畢,才執(zhí)行主進(jìn)程,所以加上join

1、執(zhí)行到j(luò)oin,是起到阻塞作用,就會(huì)執(zhí)行子進(jìn)程,然后執(zhí)行完畢,在執(zhí)行主進(jìn)程

2、也可以這樣理解,執(zhí)行到j(luò)oin,由于主進(jìn)程print(“主”)沒有執(zhí)行完,所以守護(hù)進(jìn)程不會(huì)被干掉,繼續(xù)執(zhí)行

1、守護(hù)子進(jìn)程、非守護(hù)子進(jìn)程并存

在上面的例子是子進(jìn)程只有一個(gè)守護(hù)進(jìn)程,在主進(jìn)程執(zhí)行完畢,守護(hù)子進(jìn)程就會(huì)被干掉 ,我們?cè)趤?lái)看一個(gè),子進(jìn)程既有守護(hù)子進(jìn)程,又包含非守護(hù)子進(jìn)程

from multiprocessing import Process
from threading import Thread
import time,os
def foo():
  print(123)
  time.sleep(1)
  print("end123")

def bar():

  print(456)
  time.sleep(3)
  print("end456")

if __name__ == '__main__':
  p1=Process(target=foo)
  p2 = Process(target=bar)
  p1.daemon=True
  p1.start()
  p2.start()
  print("main-------")

輸出如下:

main-------
456
end456

原因如下:由于p1,p2都是子進(jìn)程,需要開辟內(nèi)存空間,需要耗費(fèi)時(shí)間,所以會(huì)優(yōu)先輸出主進(jìn)程“main”,由于p1是守護(hù)子進(jìn)程,p2是非守護(hù)子進(jìn)程,當(dāng)主進(jìn)程執(zhí)行完畢(注意之類主進(jìn)程還沒有退出,因?yàn)檫€有p2非守護(hù)進(jìn)程),p1守護(hù)進(jìn)程也就退了,但是還有一個(gè)p2非守護(hù)進(jìn)程,所以p2會(huì)執(zhí)行自己的代碼任務(wù),當(dāng)p2執(zhí)行完畢,那么主進(jìn)程也就退出了,進(jìn)而整個(gè)程序就退出了

守護(hù)線程

守護(hù)子線程

無(wú)論是進(jìn)程還是線程,都遵循:守護(hù)xxx會(huì)等待主xxx運(yùn)行完畢后被銷毀

需要強(qiáng)調(diào)的是:運(yùn)行完畢并非終止運(yùn)行

1.對(duì)主進(jìn)程來(lái)說(shuō),運(yùn)行完畢指的是主進(jìn)程代碼運(yùn)行完畢

2.對(duì)主線程來(lái)說(shuō),運(yùn)行完畢指的是主線程所在的進(jìn)程內(nèi)所有非守護(hù)線程統(tǒng)統(tǒng)運(yùn)行完畢,主線程才算運(yùn)行完畢

詳細(xì)解釋:

1 主進(jìn)程在其代碼結(jié)束后就已經(jīng)算運(yùn)行完畢了(守護(hù)進(jìn)程在此時(shí)就被回收),然后主進(jìn)程會(huì)一直等非守護(hù)的子進(jìn)程都運(yùn)行完畢后回收子進(jìn)程的資源(否則會(huì)產(chǎn)生僵尸進(jìn)程),才會(huì)結(jié)束,

2 主線程在其他非守護(hù)線程運(yùn)行完畢后才算運(yùn)行完畢(守護(hù)線程在此時(shí)就被回收)。因?yàn)橹骶€程的結(jié)束意味著進(jìn)程的結(jié)束,進(jìn)程整體的資源都將被回收,而進(jìn)程必須保證非守護(hù)線程都運(yùn)行完畢后才能結(jié)束。

我們先來(lái)看一個(gè)例子

from multiprocessing import Process
from threading import Thread
import os,time,random
def task():
  # t=Thread(target=time.sleep,args=(3,))
  # t.start()
  print('%s is running' %os.getpid())
  time.sleep(2)
  print('%s is done' %os.getpid())

if __name__ == '__main__':
  t=Thread(target=task)
  t.daemon = True
  t.start()
  print('主')

 輸出如下:

13368 is running

原因是:

在執(zhí)行到守護(hù)子線程t,由于主線程子線程通用一塊內(nèi)存,所以不存在不同進(jìn)程創(chuàng)建各自空間,所以就先輸出子進(jìn)程的執(zhí)行任務(wù)代碼,所以輸出print(‘%s is running' %os.getpid()),由于time.sleep(2),所以就會(huì)執(zhí)行主線程“main”,然后主線程執(zhí)行完畢,那么即使2秒過(guò)后,由于主線程執(zhí)行完畢,那么子守護(hù)線程也就退出了,所以 print(‘%s is done' %os.getpid())就不會(huì)執(zhí)行了

守護(hù)子線程非守護(hù)子進(jìn)程并存

我們解析來(lái)看一個(gè)守護(hù)子線程非守護(hù)子進(jìn)程并存的例子

from threading import Thread
import time
def foo():
  print(123)
  time.sleep(1)
  print("end123")

def bar():
  print(456)
  time.sleep(3)
  print("end456")

if __name__ == '__main__':
  t1=Thread(target=foo)
  t2 = Thread(target=bar)

  t1.daemon=True

  t2.start()
  t1.start()
  print("main-------")

輸出如下:

456
123
main-------

end123

end456

原因是:

t1是守護(hù)子線程,t2非守護(hù)子線程,跟主線程使用一塊內(nèi)存,所以會(huì)輸出t1,t1子線程的任務(wù)代碼,所以執(zhí)行456,123由于t1,t2都有睡眠時(shí)間,所以執(zhí)行主線程代碼,然后對(duì)主線程來(lái)說(shuō),運(yùn)行完畢指的是主線程所在的進(jìn)程內(nèi)所有非守護(hù)線程統(tǒng)統(tǒng)運(yùn)行完畢,主線程才算運(yùn)行完畢,所以會(huì)執(zhí)行t1,t2睡眠后的任務(wù)代碼,然后程序退出。

我們會(huì)問(wèn)為什么t1守護(hù)子線程,也會(huì)執(zhí)行sleep后的代碼,不是說(shuō)主線程代碼執(zhí)行完畢,守護(hù)線程就被干掉了嗎?這里要注意是對(duì)主線程來(lái)說(shuō),運(yùn)行完畢指的是主線程所在的進(jìn)程內(nèi)所有非守護(hù)線程統(tǒng)統(tǒng)運(yùn)行完畢,主線程才算運(yùn)行完畢,當(dāng)時(shí)t2還沒執(zhí)行完畢

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python圖像銳化與邊緣檢測(cè)之Sobel與Laplacian算子詳解

    Python圖像銳化與邊緣檢測(cè)之Sobel與Laplacian算子詳解

    圖像銳化和邊緣檢測(cè)主要包括一階微分銳化和二階微分銳化,本文主要講解常見的圖像銳化和邊緣檢測(cè)方法,即Sobel算子和Laplacian算子,感興趣的可以了解一下
    2022-12-12
  • Python修改列表值問(wèn)題解決方案

    Python修改列表值問(wèn)題解決方案

    這篇文章主要介紹了Python修改列表值問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Python requests模塊實(shí)例用法

    Python requests模塊實(shí)例用法

    在本篇文章中小編給大家分享了關(guān)于Python requests模塊實(shí)例用法,有需要的朋友們學(xué)習(xí)參考下。
    2019-02-02
  • python列表推導(dǎo)式 經(jīng)典代碼

    python列表推導(dǎo)式 經(jīng)典代碼

    這篇文章主要介紹了python列表推導(dǎo)式,文章內(nèi)容附有經(jīng)典的詳細(xì)代碼,感興趣的小伙按可以參考下面文章具體內(nèi)容
    2021-10-10
  • Python hasattr函數(shù)的具體使用

    Python hasattr函數(shù)的具體使用

    本文主要介紹了Python hasattr函數(shù)的具體使用,包括基本用法、返回值、應(yīng)用場(chǎng)景,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-02-02
  • python文字和unicode/ascll相互轉(zhuǎn)換函數(shù)及簡(jiǎn)單加密解密實(shí)現(xiàn)代碼

    python文字和unicode/ascll相互轉(zhuǎn)換函數(shù)及簡(jiǎn)單加密解密實(shí)現(xiàn)代碼

    這篇文章主要介紹了python文字和unicode/ascll相互轉(zhuǎn)換函數(shù)及簡(jiǎn)單加密解密實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • Python的Pandas庫(kù)中使用DataFrame篩選和刪除含特定值的行與列

    Python的Pandas庫(kù)中使用DataFrame篩選和刪除含特定值的行與列

    Pandas是一個(gè)強(qiáng)大的數(shù)據(jù)處理庫(kù),提供了各種功能來(lái)操作和處理數(shù)據(jù),這篇文章主要給大家介紹了關(guān)于Python的Pandas庫(kù)中使用DataFrame篩選和刪除含特定值的行與列的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-05-05
  • Python使用gensim計(jì)算文檔相似性

    Python使用gensim計(jì)算文檔相似性

    在文本處理中,比如商品評(píng)論挖掘,有時(shí)需要了解每個(gè)評(píng)論分別和商品的描述之間的相似度,以此衡量評(píng)論的客觀性。那么python 里面有計(jì)算文本相似度的程序包嗎,恭喜你,不僅有,而且很好很強(qiáng)大。下面我們就來(lái)體驗(yàn)下gensim的強(qiáng)大
    2016-04-04
  • Python list運(yùn)算操作代碼實(shí)例解析

    Python list運(yùn)算操作代碼實(shí)例解析

    這篇文章主要介紹了Python list運(yùn)算操作代碼實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • 基于Django ORM、一對(duì)一、一對(duì)多、多對(duì)多的全面講解

    基于Django ORM、一對(duì)一、一對(duì)多、多對(duì)多的全面講解

    今天小編就為大家分享一篇基于Django ORM、一對(duì)一、一對(duì)多、多對(duì)多的全面講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-07-07

最新評(píng)論