- 当一个进程启动之后,会默认产生一个主线程,因为线程是程序执行流的最小单元,当设置多线程时,主线程会创建多个子线程,在python中,默认情况下(其实就是setDaemon(False)),主线程执行完自己的任务以后,就退出了,此时子线程会继续执行自己的任务,直到自己的任务结束
- 当我们使用setDaemon(True)方法,设置子线程为守护线程时,主线程一旦执行结束,则全部线程全部被终止执行,可能出现的情况就是,子线程的任务还没有完全执行结束,就被迫停止
- 此时join的作用就凸显出来了,join所完成的工作就是线程同步,即主线程任务结束之后,进入阻塞状态,一直等待其他的子线程执行结束之后,主线程在终止(等待结束)
- join有一个timeout参数:
- 当设置守护线程时,含义是主线程对于子线程等待timeout的时间将会杀死该子线程,最后退出程序。所以说,如果有10个子线程,全部的等待时间就是每个timeout的累加和。简单的来说,就是给每个子线程一个timeout的时间,让他去执行,时间一到,不管任务有没有完成,直接杀死。
- 没有设置守护线程时,主线程将会等待timeout的累加和这样的一段时间,时间一到,主线程结束,但是并没有杀死子线程,子线程依然可以继续执行,直到子线程全部结束,程序退出
1. 多进程 multiprocessing
获取当前进程编号: os.getpid()
获取当前进程的父进程编号: os.getppid()
sub_process = multiprocessing.Process(target=resendstatus01(), daemon=True)
sub_process.daemon = True # daemon 方法2
sub_process.start()
2. 多线程 threading
多线程之间执行顺序是无序的
- 传参可以使用truple(args) 和 dict. (kwargs)
- daemon 守护线程
默认主线程等待子线程结束后再结束. 可以设置daemon 实现主线程结束,程序即结束
- 方法1:
- 启动时
sub_thread = threading.Thread(target=re01(), daemon=True)
- 方法2: 必须放在start前
sub_thread = threading.Thread(target=re01(), daemon=True)
sub_thread.setDaemon(True)
sub_thread.start()
3.线程安全
4.线程池
5.多进程 与 多线程
多进程/多线程 不能接收返回值.
进程池/线程池async可以接收返回值.
线程锁放在全局即可,进程锁需要传入函数
async在python3.4引入,之前可以使用gevent
results = []
pool = multiprocessing.Pool(5)
result = pool.apply_async()
results.append(result)
for res in results:
# 获取 进程池async的返回值. 无需再close和join
print(res.get())
# 一次性使用时需要添加.保证进程池任务全部完成,主进程才退出
pool.close()
pool.join()