多个请求同时使用urllib2.urlopen()

时间:2015-01-16 06:07:37

标签: python urllib2

我的问题是这个;是否可以同时请求两个不同的URL?

我正在尝试做的是使用Python脚本同时调用来自两个不同URL的请求。使两个PHP脚本同时运行(在不同的服务器上运行终端命令)。我的问题是我不能一个接一个地做,因为他们每个人都需要特定的时间来做某事,并且需要同时运行,并在同一时间结束。

这可以使用urllib2.urlopen吗?如果是这样,我该怎么做呢?

如果没有,那么这样做的好方法是什么?

目前我有类似的东西:

import urllib2
...
if cmd.startswith('!command '):
    cmdTime = cmd.replace('!command ','',1)
    urllib2.urlopen('http://example.com/page.php?time='+cmdTime)
    urllib2.urlopen('http://example2.com/page.php?time='+cmdTime)
    print "Finished."

我的问题是它们不会同时运行。

如果我做了!命令60,那么它将运行site.com 60秒,然后转到site2.com 60秒并运行那个。

2 个答案:

答案 0 :(得分:3)

我建议你创建一个获取解析源的函数,你应该在列表中传递一个url列表作为参数。稍后循环访问URL列表并使用线程。 我会为您发布一些示例代码,请相应修改。

import threading
import urllib2


def execute_url_list(urls_list):
    if cmd.startswith('!command '):
    cmdTime = cmd.replace('!command ','',1)
    for url in urls_list:
        urllib2.urlopen(url+cmdTime)

urls_list = ['url1', 'url2']
processes = []
for k in urls_list:
    process = threading.Thread(target=execute_url_list, args=[k])
    process.setDaemon(True)
    process.start()
    processes.append(process)


for process in processes:
    process.join()

答案 1 :(得分:0)

我认为您可以使用多线程并在一个线程中发送一个请求。在python中,您可以继承threading.Thread类并覆盖run方法。您可以启动两个线程并在两个线程中使用synchronous来确保两个请求几乎同时发送。

但我认为它不能确保服务器上的php脚本会同时完全执行,因为网络时间和系统调度时间不受你的控制。