urllib2和httplib线程安全吗?

urllib2和httplib线程安全吗?,第1张

urllib2和httplib线程安全吗?

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
    参数。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4899752.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-12
下一篇 2022-11-12

发表评论

登录后才能评论

评论列表(0条)

保存