- 226 Python 如何创建线程
- 227 多线程:交替获得 CPU 时间片
- 228 抢夺全局变量出现的场景
- 229 多线程之副作用
- 230 某些场景多线程加锁后变为鸡肋
- 231 高效的协程及案例
- 232 数数
Counter
最好用 - 233 说说死锁、
GIL
锁、协程
226 Python 如何创建线程
创建一个线程:
import threading
my_thread = threading.Thread()
创建一个名称为 my_thread 的线程:
my_thread = threading.Thread(name='my_thread')
创建线程,需要告诉这个线程,它能帮助我们做什么。
做什么,是通过参数 target 传入,参数类型为 callable。
In [49]: def print_i(i):
...: print('打印i:%d'%(i,))
In [50]: my_thread = threading.Thread(target=print_i,args=(1,))
my_thread 线程已全副武装,但是,我们得按下发射按钮,启动 start(),它才开始真正起飞。
In [52]: my_thread.start()
打印结果如下,其中 args 指定函数 print_i 需要的参数 i,类型为元组。
打印
i:1
227 多线程:交替获得 CPU 时间片
为了更好解释,假定计算机是单核的,尽管对于 cpython,这个假定有些多余。
开辟 3 个线程,装载到 threads 中:
In [1]: import time
In [3]: import threading
In [14]: def print_time():
...: for _ in range(5): # 在每个线程中打印 5 次
...: time.sleep(0.1) # 模拟打印前的相关处理逻辑
...: print('当前线程%s,打印结束时间为:%s' %(threading.current_thread().getName(
...: ),time.time()))
In [7]: threads = [threading.Thread(name='t%d'%(i,),target=print_time) for i in range(3)]
启动 3 个线程:
In [8]: [t.start() for t in threads]
Out[8]: [None, None, None]
打印结果,如下,
当前线程t0,打印结束时间为:1582761727.4976637
当前线程t1,打印结束时间为:1582761727.4976637
当前线程t2,打印结束时间为:1582761727.498664
当前线程t0,打印结束时间为:1582761727.597949
当前线程t1,打印结束时间为:1582761727.597949
当前线程t2,打印结束时间为:1582761727.599801
当前线程t1,打印结束时间为:1582761727.6984522
当前线程t0,打印结束时间为:1582761727.6984522
当前线程t2,打印结束时间为:1582761727.7001588
当前线程t1,打印结束时间为:1582761727.7988598
当前线程t0,打印结束时间为:1582761727.7996202
当前线程t2,打印结束时间为:1582761727.8006535
当前线程t1,打印结束时间为:1582761727.8994005
当前线程t0,打印结束时间为:1582761727.900454
当前线程t2,打印结束时间为:1582761727.9024456
根据操作系统的调度算法,t0, t1, t2 三个线程,轮询获得 CPU 时间片。