使用urllib的Python线程
我用Python同时请求一个网络服务,发出很多请求。为此,我创建了多个线程,并使用urllib(我用的是Python 2.6的第一个版本)。
当我启动这些线程时,一切都很顺利,直到有一个线程到达ulllib.urlopen()。这时,第二个线程必须等第一个线程结束后才能继续执行ulllib.urlopen()这个函数。因为在获取到远程网络服务返回的JSON后,我还要做很多工作,所以我希望第二个线程能在第一个线程关闭连接后,或者同时进行“urlopen”。
我尝试在获取到返回的JSON后立即关闭打开的连接,但这样并没有改变什么。第二个线程还是得等第一个线程结束。我是通过打印信息来观察这一点的。
我能理解urllib不是线程安全的(网上查这个也没有明确的答案),但为什么第二个线程必须等第一个线程结束,而不是只等连接的处理结束呢?
谢谢你的帮助和建议。
附注:我不使用Python 3是为了与我需要的模块/包保持兼容。
1 个回答
1
这听起来不像是正常的行为,因为两个并行的urllib请求应该是可以的。你确定你的远程服务器能处理两个同时的请求吗?比如说,它不是在调试模式下只用一个线程?
无论如何,在线程方面,Python的并行编程并不是推荐的做法。最好使用进程或者异步,特别是在服务器端(你没有提到具体的使用场景或者平台,这可能也有问题)。
我在处理和转换JSON/XML时,使用Spawning和Eventlets的体验非常好,它们可以让Python的socket代码变成异步的。