目录
前言
很久很久以前,我写了篇文章《简单爬虫的通用步骤》,这篇文章中对于多线程/多进程/分布式/增量爬虫没有具体例子进行解释,现在来填坑了。
- 本文以及本系列文章只适用于小白入门,欢迎各路大神指点。
- 欢迎转载
- 首发于ZKeeer's Blog——简单爬虫的通用步骤——多线程/多进程爬虫示例
介绍
单线程爬虫就像是一个人处理一堆事情,没法同时处理很多事,效率单一。多线程爬虫可以比作好多人组了一个team来处理这一堆事情。多进程爬虫可以说是,有多个team(team里面可能有一个或多个人)来处理一堆事情。大多数情况下,多线程/多进程比单线程效率高得多。多进程相比于多线程,开销较大,在规模不大的问题处理上,可能多线程比多进程效率高,就好比team内部交流比跨team交流顺畅。
多线程基本操作
仅介绍本文中用到的多线程基本操作以供入门,需要更多进阶知识,请自行学习。
在python中,建议使用threading高级模块,而不是_thread模块。
from threading import Thread
import time
def func1(index):
print("I'm thread {}".format(index))
time.sleep(index)
print("Thread {} end".format(index))
if __name__ == '__main__':
start_time = time.time()
thread_list = []
# 实例化一个线程
# target是目标函数,记得别加括号
# args是目标函数的参数,当参数个数仅有一个时,记得后面加上','逗号
for index in range(1,10):
thread_list.append(Thread(target=func1, args=(index,)))
# 用start启动线程
for t in thread_list:
t.start()
# join表示等待线程执行结束
for t in thread_list:
t.join()
print("用时:{:.2f}s".format(time.time()-start_time))
多线程通信没什么值得注意的,用全局变量也行,用类中的公有成员也行。
但要注意一点,多线程共享一个变量时,同时读写会造成数据错误。多进程会将变量各自