Python urllib2和httplib是线程安全的吗?
我正在查找有关Python urllib2和httplib是线程安全的吗?,python,thread-safety,urllib2,httplib,Python,Thread Safety,Urllib2,Httplib,我正在查找有关urllib2和httplib的线程安全性的信息。 官方文件(和)缺少关于该主题的任何信息;这里甚至没有提到线程这个词 更新 好的,它们不是线程安全的开箱即用。 要使它们成为线程安全的,需要什么?或者是否存在一种可以实现线程安全的场景? 我这么问是因为看起来 在每个线程中使用单独的 不在服务器之间共享HTTP连接 线程 在线程中安全地使用这些lib就足够了。类似的使用场景也在讨论中提出httplib和urlib2是线程安全的 urllib2不提供对全局(共享)文件的序列化访问
urllib2
和httplib
的线程安全性的信息。
官方文件(和)缺少关于该主题的任何信息;这里甚至没有提到线程这个词
更新
好的,它们不是线程安全的开箱即用。
要使它们成为线程安全的,需要什么?或者是否存在一种可以实现线程安全的场景?
我这么问是因为看起来
- 在每个线程中使用单独的
- 不在服务器之间共享HTTP连接 线程
在线程中安全地使用这些lib就足够了。类似的使用场景也在讨论中提出
httplib
和urlib2
是线程安全的
urllib2
不提供对全局(共享)文件的序列化访问
OpenerDirector
对象,该对象由urlib2.urlopen()
使用
类似地,httplib
不提供对HTTPConnection
对象的序列化访问(即通过使用线程安全的连接池),因此在线程之间共享HTTPConnection
对象是不安全的
如果需要线程安全性,我建议使用或作为替代方案
通常,如果一个模块的文档没有提到线程安全,我会假设它不是线程安全的。您可以查看模块的源代码进行验证
在浏览源代码以确定模块是否是线程安全的时,您可以
可以从查找线程同步原语的用法开始
线程化
或多处理
模块,或使用队列.队列
更新
以下是urllib2.py
(Python 2.7.2)中的相关源代码片段:
当并发线程调用install\u opener()
和urlopen()
时,存在明显的争用情况
另外,请注意,使用Request
对象作为url
参数调用urlopen()
,可能会使Request
对象发生变异(请参阅源代码),因此使用共享Request
对象同时调用urlopen()
是不安全的
总之,如果满足以下条件,urlopen()
是线程安全的:
不是从另一个线程调用的install\u opener()
- 非共享的
对象或字符串用作请求
参数url
_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