日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python守护线程

發(fā)布時(shí)間:2025/3/15 python 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python守护线程 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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

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

  • 其一:守護(hù)進(jìn)程會(huì)在主進(jìn)程代碼執(zhí)行結(jié)束后就終止
  • 其二:守護(hù)進(jìn)程內(nèi)無(wú)法再開(kāi)啟子進(jìn)程,否則拋出異常:AssertionError: daemonic processes are not allowed to havechildren
  • 注意:進(jìn)程之間是互相獨(dú)立的,主進(jìn)程代碼運(yùn)行結(jié)束,守護(hù)進(jìn)程隨即終止

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

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    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ú)法再開(kāi)啟子進(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)程需要開(kāi)辟內(nèi)存空間,由于需要耗費(fèi)時(shí)間,所以主進(jìn)程會(huì)首先輸出“主”,由于主進(jìn)程執(zhí)行完畢,那么守護(hù)子進(jìn)程p也就被干掉了,隨之主進(jìn)程也就退出了

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

    1

    2

    3

    4

    5

    6

    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(“主”)沒(méi)有執(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)程

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    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)程,需要開(kāi)辟內(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)程還沒(méi)有退出,因?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è)例子

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    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)程并存的例子

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    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還沒(méi)執(zhí)行完畢

    最后根據(jù)這篇文章談?wù)勎覍?duì)主線程和子線程的理解

    主線程就是程序本身執(zhí)行所開(kāi)啟的線程,子線程就是在程序中利用語(yǔ)句建立的線程。

    參考自https://www.jb51.net/article/139521.htm

    總結(jié)

    以上是生活随笔為你收集整理的python守护线程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。