【Python】多线程

1. threading模块是Python里面常用的线程模块,多线程处理任务对于提升效率非常重要,先说一下线程和进程的各种区别。

进程:

优点:同时利用多个cpu,能够同时进行多个操作

缺点:耗费资源(重新开辟内存空间)

线程:

优点:共享内存,IO操作时创造并发操作

缺点:抢占资源

进程不是越多越好,cpu个数=进程个数

线程也不是越多越好,具体案例具体分析,请求上下文切换耗时

计算机中执行任务的最小单元:线程

IO操作利用CPU


概括起来就是

IO密集型(不用CPU)——多线程

计算密集型(用CPU)——多进程

使用线程和进程的目的都是为了提升效率

(1)单进程单线程,主进程、主线程

(2)自定义线程:

        主进程

            主线程

            子线程

2. threading模块可以创建多个线程,不过由于GIL锁的存在,Python在多线程里面其实是快速切换。

在线程里面setDaemon()和join()方法都是常用的,他们的区别如下:

(1)join ()方法:主线程A中,创建了子线程B,并且在主线程A中调用了B.join(),那么,主线程A会在调用的地方等待,直到子线程B完成操作后,才可以接着往下执行,那么在调用这个线程时可以使用被调用线程的join方法。join([timeout]) 里面的参数时可选的,代表线程运行的最大时间,即如果超过这个时间,不管这个此线程有没有执行完毕都会被回收,然后主线程或函数都会接着执行的,如果线程执行时间小于参数表示的时间,则接着执行,不用一定要等待到参数表示的时间。

 (2)setDaemon()方法。主线程A中,创建了子线程B,并且在主线程A中调用了B.setDaemon(),这个的意思是,把主线程A设置为守护线程,这时候,要是主线程A执行结束了,就不管子线程B是否完成,一并和主线程A退出。这就是setDaemon方法的含义,这基本和join是相反的。此外,还有个要特别注意的:必须在start() 方法调用之前设置,如果不设置为守护线程,程序会被无限挂起,只有等待了所有线程结束它才结束。

3、Python多线程里面的锁

        在多线程处理任务的时候,在同时操作一个数据的时候可能会造成脏数据,这时候就出现了锁的概念,也就是有一个线程在操作该数据的时候,就把该数据锁上,防止别的线程操作,操作完了再释放锁。

 4、Python多线程里面的event方法

        该方法的具体用法是给线程设置红绿灯,红灯表示停,绿灯表示运行,如代码

import threading
import time

def do(event):
    print('start')
    event.wait()  # 红灯,所有线程执行都这里都在等待
    print('end')

event_obj = threading.Event()  # 创建一个事件
for i in range(10):  # 创建10个线程
    t = threading.Thread(target=do, args=(event_obj,))
    t.start()

time.sleep(5)
event_obj.clear()  # 让灯变红,默认也是红的,阻塞所有线程运行
data = input('请输入要:')
if data == 'True':
    event_obj.set()  # 变绿灯

【Python】多线程

参考:

多线程

Python之threading多线程