Python 全栈:多线程和协程入门练习

  • 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 时间片。

你可能感兴趣的:(Python 全栈:多线程和协程入门练习)