我正在寻找关于线程安全信息urllib2
和httplib
。官方文档(http://docs.python.org/library/urllib2.html和http://docs.python.org/library/httplib.html)缺少有关此主题的任何信息。那里甚至没有提到
线程 一词…
更新
好的,它们不是线程安全的。使它们具有线程安全性需要什么,或者存在使它们具有线程安全性的情况?我问是因为好像
OpenerDirector
在每个线程中使用单独的httplib
和urllib2
是 不是 线程安全的。
urllib2
不提供对全局(共享)OpenerDirector
对象的序列化访问 urllib2.urlopen()
。
同样,httplib
不提供对HTTPConnection
对象的序列化访问(即通过使用线程安全的连接池),因此HTTPConnection
在线程之间共享对象也不安全。
如果需要线程安全,建议使用httplib2或urllib3作为替代。
通常,如果模块的文档 中没有提到线程安全 ,则我认为它不是线程安全的。您可以查看模块的源代码以进行验证。
在浏览源代码以确定模块是否是线程安全的时,您可以从threading
或multiprocessing
模块中查找对线程同步原语的用法,或从中查找
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
参数。问题内容: 我正在尝试通过在Python中编写登录序列脚本来测试Web应用程序的功能,但遇到了一些麻烦。 这是我需要做的: 使用一些参数和标头执行POST。 跟随重定向 检索HTML正文。 现在,我对python还是比较陌生,但是到目前为止我测试过的两件事都没有用。首先,我将httplib与putrequest()(在URL中传递参数)和putheader()一起使用。这似乎没有遵循重定向。 然后
问题内容: 我经常听到对Swing库中缺乏线程安全性的批评。但是,我不确定自己将在自己的代码中执行的操作会导致问题: 在什么情况下,Swing不是线程安全的事实起作用? 我应该积极避免做什么? 问题答案: 切勿执行长时间运行的任务以响应按钮,事件等,因为这些事件在事件线程上。如果您阻止事件线程,则整个GUI将完全无响应,从而使用户感到非常生气。这就是为什么Swing看起来缓慢又硬朗。 使用线程,执
该项目是使用Play framework和Scala语言编写的。我已经实现了编译时依赖关系。我在游戏中遵循了以下示例: https://github.com/playframework/play-scala-compile-di-example 查看MyApplicationLoader。scala: 以及以下代码行: 我的理解是,在第一次调用HomeController时,只创建了一个HomeC
问题内容: 我目前有一个项目,该项目使用杰克逊更快的xml使用自定义序列化器和反序列化器将POJO序列化/反序列化到Json。据我了解,一旦创建并配置了ObjectMapper,它就是线程安全的。但是,我注意到使用JMeter运行测试时,偶尔会发生以下情况- 线程1进入CustomerSerializer并开始序列化 线程2进入CustomSerializer,与线程1交互,并开始从头到尾进行序列
SSLHandler类在多个线程中使用,如下所示: 因此,为每个新线程创建一个SSLHandler。为了避免这种情况,我考虑使用单例模式重构SSLHandler:
问题内容: 在多个类中,是否是线程安全的? 问题答案: 尽管EntityManager实现本身不是线程安全的,但是Java EE容器注入了一个代理,该代理将所有方法调用委托给与事务绑定的EntityManager。因此,每个事务都使用其自己的EntityManager实例。至少对于事务范围的持久性上下文而言,这是正确的(默认设置)。 如果容器将在每个bean中注入EntityManager的新实例