一、进程日志
# 进程日志 import multiprocessing import logging import sys def worker(): print('I am working....') sys.stdout.flush() if __name__ == '__main__': multiprocessing.log_to_stderr() # 设置日志输出到控制台 logger = multiprocessing.get_logger() logger.setLevel(logging.INFO) # 设置输出日志的级别 p = multiprocessing.Process(target=worker) p.start() p.join() 结果: I am working.... [INFO/Process-1] child process calling self.run() [INFO/Process-1] process shutting down [INFO/Process-1] process exiting with exitcode 0 [INFO/MainProcess] process shutting down
二、守护进程
# 守护进程:只要主进程结束了,守护进程不管执行完毕否,都要退出 # 非守护进程:主进程结束了,守护进程可以继续执行,直到结束 import multiprocessing import time, logging import sys def daemon(): # 守护进程的任务 p = multiprocessing.current_process() # 获取当前进程对象 print('Starting:', p.name, p.pid) # 打印进程名字 sys.stdout.flush() # 将缓冲区数据写入终端(防止数据太少而不打印) time.sleep(2) print('Exiting :', p.name, p.pid) sys.stdout.flush() def non_daemon(): # 非守护进程的任务 p = multiprocessing.current_process() print('Starting:', p.name, p.pid) sys.stdout.flush() print('Exiting :', p.name, p.pid) sys.stdout.flush() if __name__ == '__main__': multiprocessing.log_to_stderr() # 设置日志输出到控制台 logger = multiprocessing.get_logger() logger.setLevel(logging.DEBUG) # 设置输出日志的级别 d = multiprocessing.Process(name='daemon', target=daemon) d.daemon = True # 把d进程设定为守护进程,默认是False n = multiprocessing.Process(name='non-daemon', target=non_daemon) n.daemon = False # 把n进程设定为非守护进程,默认是False d.start() time.sleep(1) n.start() # d.join(1) # n.join() print('d.is_alive()', d.is_alive()) # 打印这个进程是否是活动状态 print("n.is_alive()", n.is_alive()) # 打印这个进程是否是活动状态 print("main Process end!") 结果: [INFO/daemon] child process calling self.run() Starting: daemon 116912 d.is_alive() True n.is_alive() True main Process end! [INFO/MainProcess] process shutting down [DEBUG/MainProcess] running all "atexit" finalizers with priority >= 0 [INFO/MainProcess] calling terminate() for daemon daemon [INFO/MainProcess] calling join() for process non-daemon Starting: non-daemon 115272 Exiting : non-daemon 115272 [INFO/non-daemon] child process calling self.run() [INFO/non-daemon] process shutting down [DEBUG/non-daemon] running all "atexit" finalizers with priority >= 0 [DEBUG/non-daemon] running the remaining "atexit" finalizers [INFO/non-daemon] process exiting with exitcode 0 [INFO/MainProcess] calling join() for process daemon [DEBUG/MainProcess] running the remaining "atexit" finalizers Process finished with exit code 0