【问题标题】:Multiple requests using urllib2.urlopen() at the same time同时使用 urllib2.urlopen() 的多个请求
【发布时间】:2015-03-14 17:12:57
【问题描述】:

我的问题是这样的;是否可以同时请求两个不同的 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."

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

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

【问题讨论】:

标签: python urllib2


【解决方案1】:

我建议您创建一个用于获取已解析源的函数,您应该在其中传递要在列表中抓取的 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()

【讨论】:

  • 请注意有一些关于 urllib2 的thread safety concerns,尽管这个例子是可以的,只要 url 是字符串。
  • @KillianDS:我同意你的观点,线程的使用确实有限制,但字符串 url 不会产生任何问题。很长一段时间以来我一直在使用它。感谢您指出这一点。
  • 不确定,但我认为 'processes = []' 应该在 for 循环之外定义。
  • @Alex:我的错误流程=[] 应该在 for 循环之前定义,否则它将在每次迭代中被清空。感谢您指出我也会更新答案。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-09
    • 1970-01-01
    相关资源
    最近更新 更多