httplib和
urllib2是 不是 线程安全的。
urllib2不提供对全局(共享)
OpenerDirector对象的序列化访问
urllib2.urlopen()。
同样,
httplib不提供对
HTTPConnection对象的序列化访问(即通过使用线程安全的连接池),因此
HTTPConnection在线程之间共享对象也不安全。
如果需要线程安全,建议使用httplib2或urllib3作为替代。
通常,如果模块的文档 中没有提到线程安全 ,则我认为它不是线程安全的。您可以查看模块的源代码以进行验证。
在浏览源代码以确定模块是否是线程安全的时,您可以从
threading或
multiprocessing模块中查找对线程同步原语的用法,或从中查找
queue.Queue。
更新
以下是
urllib2.py(Python 2.7.2)的相关源代码片段:
_opener = Nonedef 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
当并发线程调用
install_opener()和时,存在明显的竞争条件
urlopen()。
另外,请注意,
urlopen()使用
Request对象作为
url参数进行调用可能会使该
Request对象发生变化(请参见参考资料中的
OpenerDirector.open()),因此并发调用
urlopen()共享
Request对象并不安全。
urlopen()如果满足以下条件,则总的来说是线程安全的:
install_opener()
不从另一个线程调用。- 阿 非共享
Request
对象,或字符串被用作url
参数。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)