urllib2 和 httplib 线程安全吗?

2023-12-04

我正在寻找有关线程安全的信息urllib2 and httplib。 官方文档(http://docs.python.org/library/urllib2.html and http://docs.python.org/library/httplib.html) 缺乏有关该主题的任何信息;这个单词thread那里甚至没有提到...

UPDATE

好吧,它们并不是开箱即用的线程安全的。 需要什么才能使它们成为线程安全的,或者是否存在它们可以成为线程安全的场景? 我问是因为看起来

  • 使用单独的OpenerDirector在每个线程中
  • 不共享 HTTP 连接 线程

足以在线程中安全地使用这些库。有问题中提出了类似的使用场景urllib2 和 cookielib 线程安全


httplib and urllib2 are not线程安全。

urllib2不提供对全局(共享)的序列化访问OpenerDirector对象,它被使用urllib2.urlopen().

相似地,httplib不提供序列化访问HTTPConnection对象(即通过使用线程安全的连接池),因此共享HTTPConnection线程之间的对象不安全。

我建议使用httplib2 or urllib3如果需要线程安全,则作为替代方案。

一般来说,如果一个模块的文档没有提到线程安全,我认为它不是线程安全的。您可以查看该模块的源代码进行验证。

当浏览源代码以确定模块是否是线程安全时,您 可以从寻找线程同步原语的使用开始threading or 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

并发线程调用时存在明显的竞争条件install_opener() and urlopen().

另请注意,调用urlopen() with a Request对象作为url参数可能会改变Request对象(请参阅来源OpenerDirector.open()),所以并发调用是不安全的urlopen()与一个共享的Request object.

总而言之,urlopen()如果满足以下条件,则线程安全:

  • install_opener()不是从另一个线程调用的。
  • A 非共享 Request对象或字符串用作url范围。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

urllib2 和 httplib 线程安全吗? 的相关文章

随机推荐