Pio*_*ost 20 python urllib2 thread-safety httplib
我正在寻找有关urllib2和httplib的线程安全性的信息.官方文档(http://docs.python.org/library/urllib2.html和http://docs.python.org/library/httplib.html)缺少有关此主题的任何信息; 那里没有提到线程这个词......
UPDATE
好吧,它们不是开箱即用的线程安全.是什么使它们成为线程安全的,或者是否存在可以线程安全的场景?我问,因为它似乎是
urllib2在每个线程中使用单独的足以在线程中安全地使用这些库.类似的使用场景提出了问题urllib2和cookielib线程安全性
Gre*_*egg 41
httplib和urllib2是不是线程安全的.
urllib2不提供对使用的全局(共享)OpenerDirector对象的序列化访问
urllib2.urlopen().
同样,httplib不提供对HTTPConnection对象的序列化访问(即通过使用线程安全的连接池),因此HTTPConnection在线程之间共享对象是不安全的.
如果需要线程安全,我建议使用httplib2或urllib3作为替代方案.
通常,如果模块的文档没有提到线程安全性,我会认为它不是线程安全的.您可以查看模块的源代码以进行验证.
在浏览源代码以确定模块是否是线程安全的时,您可以首先查找来自threading或multiprocessing模块的线程同步原语的
使用,或者使用queue.Queue.
UPDATE
以下是urllib2.py(Python 2.7.2)的相关源代码片段:
_opener = None
def urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT):
global _opener
if _opener is None:
_opener = build_opener()
return _opener.open(url, data, timeout)
def install_opener(opener):
global _opener
_opener = opener
Run Code Online (Sandbox Code Playgroud)
有一个明显的竞争条件,当并发线程调用install_opener()和urlopen().
另请注意,urlopen()使用Request对象作为url参数进行调用可能会使Request对象发生变异(请参阅源代码OpenerDirector.open()),因此同时urlopen()使用共享Request对象进行调用是不安全的.
总而言之,urlopen()如果满足以下条件,则是线程安全的:
install_opener() 不是从另一个线程调用.Request对象,或字符串被用作url参数.| 归档时间: |
|
| 查看次数: |
9353 次 |
| 最近记录: |