守护进程,守护线程

创建守护进程

  其一:守护进程会在主进程代码执行结束后就终止

    其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic processes are not allowed to have children

  注意:进程之间是互相独立的,主进程代码运行结束,守护进程随即终止

 

代码及现象

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())

if __name__ == '__main__':
    p=Process(target=task)
    p.daemon = True #1、必须在p.start()之前 2:守护进程不能开启子进程
    p.start()
    # p.join()
    print('')
#结果
#
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())
    p = Process(target=time.sleep, args=(3,))
    p.start()

if __name__ == '__main__':
    p=Process(target=task)
    p.daemon = True #1、必须在p.start()之前 2:守护进程不能开启子进程
    p.start()
    p.join() #这里要等一下,否则主进程很快就完,看不出现象
    print('')
#
11720 is running
11720 is done
Process Process-1:
Traceback (most recent call last):
  File "C:\Python36\lib\multiprocessing\process.py", line 258, in _bootstrap
    self.run()
  File "C:\Python36\lib\multiprocessing\process.py", line 93, in run
    self._target(*self._args, **self._kwargs)
  File "D:\视频\day32\day34\1 守护进程vs守护线程.py", line 10, in task
    p.start()
  File "C:\Python36\lib\multiprocessing\process.py", line 103, in start
    'daemonic processes are not allowed to have children'
AssertionError: daemonic processes are not allowed to have children
主果
子进程中开启子进程
举例说明守护进程的应用场景
  假设有两个任务要干,要玩出并发的效果,使用进程的话可以让主进程
  执行一个任务,然后开启一个子进程执行一个任务。

  如果这两个任务毫无关系,那么就像上面这么做就可以
  如果主进程的任务在执行完毕后,子进程的任务没有存在的意义了
  那么该子进程应该在开启之前就被设置成守护进程

守护进程与子进程同时存在的例子
from multiprocessing import Process
import time
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

创建守护线程

from threading import Thread
import os,time,random

def task():
    print('%s is running' %os.getpid())
    time.sleep(2)
    print('%s is done' %os.getpid())
    # p = Thread(target=time.sleep, args=(3,))
    # p.start()

if __name__ == '__main__':
    p=Thread(target=task)
    p.daemon = True #1、必须在p.start()之前 2:守护线程可以开启子进程
    p.start()
    print('')
#运行结果
#6120 is running
#
from threading import Thread
import os,time,random

def task():
    print('%s is running' %os.getpid())
    time.sleep(2)
    print('%s is done' %os.getpid())
    p = Thread(target=print, args=("子线程中的子线程",))
    p.start()

if __name__ == '__main__':
    p=Thread(target=task)
    p.daemon = True #1、必须在p.start()之前 2:守护进程不能开启子进程
    p.start()
    p.join()
    print('')
#结果
#14368 is running
#14368 is done
#子线程中的子线程
#
子线程中的子线程

守护线程与子线程共存

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__':
    p1=Thread(target=foo)
    p2 = Thread(target=bar)

    p1.daemon=True
    p1.start()
    p2.start()
    print("main-------")
#结果
#123
#456
#main-------
#end123
#end456

 守护进程和守护线程的结束

守护进程的结束:

  主进程代码执行完毕,或者自己结束

守护线程的结束:

  控制线程结束,或者自己结束

主进程和控制线程的代码执行完毕不意味着结束,主进程结束要等非守护子进程全部结束,回收资源。控制线程要等非守护线程全部结束才能结束,

控制线程结束意味着进程结束,进程要等其中所有的非守护线程结束才能结束。

posted @ 2017-12-04 16:26  瓜田月夜  阅读(127)  评论(0)    收藏  举报