在使用 python 做一些工作以及爬虫的时候,我们往往想要在一段时间中多个函数同时运行。而不是线性运行,运行完函数一、再运行函数二。那样太耗费我们的时间了
出于这个原因,python 自带库中提供了 threading库来解决问题
使用方法
import threadingimport timedef f1(): time.sleep(2) print('子程序运行')def f2(): print('主程序运行')t1 = threading.Thread(target=f1) #创建一个子程序(另一个独木桥) 其中这个子程序的目标是函数f1t1.start()f2()
运行这个代码会发现程序先输出“主程序运行”再输出“子程序运行”这便就是创建一个子程序来达到多线程运行的效果
其中 threading 中的 Thread 类还可以传入许多参数
例如
t1 = threading.Thread(target=f1,name='子程序',args=(),daemon=True)
在这些参数中,我认为重要的 'args,daemon'
首先介绍daemon参数的作用
在 Thread 类中 daemon 参数默认 = None
当我们将 daemon=True 时
import threadingimport timedef f1(): time.sleep(2) print('子程序运行')def f2(): print('主程序运行')t1 = threading.Thread(target=f1,daemon=True)t1.start()f2()
运行这个代码会发现 在屏幕上打印完“主程序运行”这个程序便停止运行了
也就是说 当 deamon=True 时,将不会等待子程序运行完成,当主程序运行完成时,这个程序便相当于运行完成了
args 参数
我们在编写函数时 往往会让用户传入实参,Thread类便提供了args参数来让我们传入实参
用法
import threadingimport timedef f1(name): time.sleep(2) print(f'Hello {name}')def f2(): print('主程序运行')t1 = threading.Thread(target=f1,args=('罗翔',))t1.start()f2()
我们传入一个实参'罗翔'给形参 name
这里要注意几点
- args需要传入一个元组
- 传入的参数用逗号来隔开
- 当函数只需要传入一个参数时,在那个参数后面也必须加一个逗号
这里再举一个我学习时遇到的一个问题
import threadingimport timedef f1(name): time.sleep(2) print(f'Hello {name}')def f2(): print('主程序运行')t1 = threading.Thread(target=f1('罗翔'))t1.start()f2()
最开始我是用一般函数传入参数来写的
不过这样我发现一个问题。虽然程序不会报错,但是程序会和最开始一样线性运行,也就是先调用完函数 f1 再调用 f2