初学python,在写爬虫的时候希望通过代理来抓取数据,防止本机IP被封,于是开始使用自定义opener。
问题来了,既然同一个进程的多个线程内存共享,那么调用urllib2.install_opener之后,是否意味着这个进程中的所有urllib2的open请求都会用同一个opener来实现?
如果希望分开使用不同的opener的话是不是只能考虑多进程了。。?
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
urllib2不是线程安全的,并且opener更是共享的全局变量,如下urlib2.py(python2.7.5)代码:
如果要在多线程里使用urllib需要保证install_opener不会被在多线程中同时调用,最好是在主线程安装opener。
如果要在多个线程中使用不同的opener,除了多进程外,还可以在各个子线程内创建自己的opener,然后使用各自opener的open函数进行url访问。如下:
最后针对这类url访问的任务比较推荐使用urlib3和requests,一方面线程安全,另一方面使用简单。