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即可使用,这个有点神奇

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值