栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

urllib2和httplib线程安全吗?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/369121.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号