python多线程编程
实现模块
- thread:多线程的底层支持模块,一般不建议使用;
- threading:对thread进行了封装,将一些线程的操作对象化
python 启动一个线程有两种方式
- thread.start_new_thread( print_time, (“Thread-1”, 2, ) )
- thread1 = myThread(1, “Thread-1”, 1)
函数方式
1 | #!/usr/bin/python |
类方式
1 | #!/usr/bin/python |
threading.Thread类
- 构造函数:threading.Thread(group=None, target=None, name=None, args=(), kwargs={})
group为保留参数,暂时无用;target为可调用的对象;name为线程的名字,注意多个线程可以有相同的名字;args是一个参数的tuple;kwargs为命令行参数的字典。
- name,getName(),setName(): 获取和设置线程的名字
- ident: 线程的唯一标识。线程启动后就会有,线程退出后被回收
- start(): 启动线程
- join(): 等待另一个线程结束后再运行。 join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。比如在线程B中调用了线程A的join()方法,直到线程A执行完毕后,才会继续执行线程B。
- is_alive(): 返回线程是否还存活着。
- daemon, isDaemon,setDaemon: 判断线程是否是守护线程,设置为守护线程(没有用户线程时自动退出的线程,如垃圾回收线程)。
- 参考链接:
多线程的socket服务器
在多线程编程中,t.setDaemon(True) / t.daemon = True
在底层模块中,只要主线程技结束了,其他线程都会结束
如果setDaemon(True),主线程结束,所有子线程都将结束
如果setDaemon(False),主线程将等待该线程结束,等同于你调用线程的join方法
join方法的作用是阻塞主进程,
- 参考资料
python多线程解析
守护进程
一般来说,所有的线程都完成工作以后,程序才会退出。
如果一个线程被设置为daemon,那么主线程退出的时候,它马上就退出了,这时候为了防止这种情况,可以调用join函数,线程调用join函数后,主线程就会等待子线程退出后才退出,而子线程执行的代码如果不能正常退出时那主线程也一直会等待,如果在join时加上一个超时时间,那主线程只等待设置的超时时间后主线程就退出。
线程间通信 - event
可以通过event,event.set()可以向线程发出信号,event.is_set()判断event是否被set
1 | event = threading.Event() |
线程间同步 - lock
1 | # 创建一个锁 |
线程池
服务器处理链接最简单的做法是:当一个链接进来的时候,起一个线程来专门处理这个链接。当处理完这个链接以后,关掉这个链接,并结束掉这个线程。
当有很多大量短小的任务的时候,线程创建和销毁的开销很大。
为了提高效率,减少创建和销毁的开销,就预先创建一批线程,这一批线程就是线程池。