urllib2和httplib线程安全吗?

发布于 2021-01-29 19:37:14

我正在寻找关于线程安全信息urllib2httplib。官方文档(http://docs.python.org/library/urllib2.htmlhttp://docs.python.org/library/httplib.html)缺少有关此主题的任何信息。那里甚至没有提到
线程 一词…

更新

好的,它们不是线程安全的。使它们具有线程安全性需要什么,或者存在使它们具有线程安全性的情况?我问是因为好像

  • OpenerDirector在每个线程中使用单独的
  • 不共享线程之间的HTTP连接
关注者
0
被浏览
243
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    httpliburllib2不是 线程安全的。

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

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

    如果需要线程安全,建议使用httplib2urllib3作为替代。

    通常,如果模块的文档 中没有提到线程安全 ,则我认为它不是线程安全的。您可以查看模块的源代码以进行验证。

    在浏览源代码以确定模块是否是线程安全的时,您可以从threadingmultiprocessing模块中查找对线程同步原语的用法,或从中查找
    queue.Queue

    更新

    以下是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()和时,存在明显的竞争条件urlopen()

    另外,请注意,urlopen()使用Request对象作为url参数进行调用可能会使该Request对象发生变化(请参见参考资料中的OpenerDirector.open()),因此并发调用urlopen()共享Request对象并不安全。

    urlopen()如果满足以下条件,则总的来说是线程安全的:

    • install_opener() 不从另一个线程调用。
    • 非共享 Request对象,或字符串被用作url参数。


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看