python的multiprocessing模块踩坑记录

前言

最近做多进程多IP爬虫,用到的multiprocessing模块有点坑,这里总结一下,python版本是3.6

踩坑记录

1、multiprocessing模块的子进程是不会复制父进程的数据的,这和fork函数不一样,子进程中不会有父进程中的变量,如果子进程执行的函数所需要的参数比较多,并且会有一系列函数嵌套调用,建议把子进程需要调用的全部函数与变量封装成一个类,直接将类的实例传递给子进程即可,例如:

class crawler:
     
    一系列属性
    一系列函数

    def run(self):
        主体函数

cr=crawler(.......一系列属性的初始值)
pool = multiprocessing.Pool(10) 
for i in range(0,10):
    pool.apply_async(crawler.run,(cr,))

      

这种形式需要注意是不是有临界资源存在,若有,记得在使用前上锁

2、子进程抛出的异常不会自动输出到控制台,需要我们自己捕获异常,输出到控制台或是日志

3、部分IDE对multiprocessing不是很支持,建议使用命令行直接运行对应python脚本

另外,本次爬虫的多IP不是指使用代理,而是通过DNS解析获得网站在不同地区的服务器IP地址,将域名直接改为IP地址,并在http请求头添加host字段,自己在处理京东时,发现使用https协议时,即使添加了host字段,京东的主机还是不认请求,改为http即可使用,这个有点神奇

猜你喜欢

转载自blog.csdn.net/dhaiuda/article/details/83860897