前言
本篇文章是笔者在自学Python爬虫相关技术时作的笔记。多线程/进程异步编程的目的在于通过提升CPU的工作效率来提高代码的运行速度。在实际操作时就会发现,Python相关的库和操作系统帮助我们完成了大量的操作,我们只需要指定相关的任务,具体的任务调度不需要开发者关心。这也是使用Python进行异步编程的优势所在。
声明:本文章仅探讨技术,分享相关经验。请勿使用相关技术进行任何违法行为,否则将承担法律责任。
- Python版本:3.12(基于anaconda)
- Pycharm版本:2024.1
1 线程和进程
线程可以理解为一个程序中不同的道路,这些不同的道路存在于它所属于的进程中。进程是一个资源消耗单位,对于一个程序来说,在开始运行时它就一定会占用系统中一定的内存,此时它就被赋予一个新名称:进程。一个进程包括加载到内存中的可执行代码,CPU状态,分配给进程的内存区域,打开的文件列表,IO设备。
一个进程相当于一个公司,线程就相当于是公司中的员工。公司可以指定员工的状态,它可以是禁止工作,可以开始工作等,但是公司无法决定员工什么时候工作,工作的效果等。在计算机中,什么时候运行哪个线程由CPU和操作系统决定。
2 多线程和多进程的Python实现
2.1 多线程
from threading import Thread
def func():
for i in range(100):
print('msg from func:', i)
if __name__ == '__main__':
t1 = Thread(target=func)
t1.start()
for i in range(100):
print('msg from main', i)
或者采用面向对象的方法:
from threading import Thread
class MyThread(Thread):
def run(self):
for i in range(100):
print('msg from class MyThread', i)
if __name__ == '__main__':
t1 = MyThread()
t1.start()
for i in range(100):
print('msg from main', i)
2.2 多进程
from multiprocessing import Process
def func():
for i in range(100):
print('msg from func:', i)
if __name__ == '__main__':
p = Process(target=func)
p.start()
for i in range(100):
print('msg from main', i)
在windows系统中,上面的程序会首先执行主进程,再执行子进程。要想先执行子进程,需要调用子进程的join()
方法。
2.3 传递参数
通过Thread
类的内置属性args
元组传递参数:
from threading import Thread
def func(name):
for i in range(100):
print(f'msg from func {
i}, name is {
name}')
if __name__ == '__main__':
t1 = Thread(target=func, args=('debussy',)) # 传递的参数必须是一个元组,所以要加逗号
t1.start()
for i in range(100):
print('msg from main', i)
通过面向对象的方式传递参数:
from threading import Thread
class MyThread(Thread):
def __init__(self, name):
super(MyThread, self).__init__()
self.name = name
def run(self):
for i in range(100):