【问题标题】:Multithreading / Asynchronous I/O多线程/异步 I/O
【发布时间】:2013-01-31 01:13:58
【问题描述】:

我有一个概念性问题。

我目前有一个在永无止境的循环中执行的程序。

Def (mycode):

    Perform login to server and retrieve cookies etc
    While 1:
      Perform an URL request (with custom headers, cookies etc)
      Process the reply
      Perform URL requests dependent upon the values in replies
      Process reply

我很高兴继续这样,因为 URL 必须一个接一个地调用。

现在服务器将单个帐户限制为有限数量的功能,能够使用两个(或更多)不同的帐户执行此功能会很有用。

我的问题是:这可能吗?我已经对队列和多线程进行了相当多的阅读,如果各位好心人可以提出一个具有良好(易于理解)示例的方法,我将不胜感激。

【问题讨论】:

  • 您每次都在第 1 步获取相同的网址吗?实际上轮询页面?然后对结果采取不同的行动。
  • 不完全一样。我会获取 www.foo.com/type=car,然后可能会为不同的帐户稍微更改参数

标签: python multithreading io urllib2


【解决方案1】:

Gevent 是具有示例的高性能绿色线程实现。

我不确定通过对同一服务器的不同帐户执行此操作是否意味着让不同的工作函数处理 url 处理 - 实际上每个帐户都有 Def (mycode) n 次。或许你可以扩展细节。

>>> import gevent
>>> from gevent import socket
>>> urls = ['www.google.com', 'www.example.com', 'www.python.org']
>>> jobs = [gevent.spawn(socket.gethostbyname, url) for url in urls]
>>> gevent.joinall(jobs, timeout=2)
>>> [job.value for job in jobs]
['74.125.79.106', '208.77.188.166', '82.94.164.162']

此外,您可以使用beanstalkd 之类的东西来解决问题,这将允许您为每个帐户运行主进程“n”次,并将结果放在 beanstalk 队列中以供另一个进程处理。 无需处理线程,这在非平凡的应用程序中总是一件好事。

【讨论】:

  • 我不是指工人函数。只有一个帐户可以下载每个链接。更多的是让一个帐户在一个部分上工作(即 type=car,而另一个在 type=horse 上工作)
  • 这或许是相似的吧? stackoverflow.com/questions/6905800/…
  • 可能,我确实看过那个例子。我不确定的是如何处理正在传递的不同 cookie。
  • 好吧,我只能建议您先获得一个功能,该功能先完成您想要的功能,然后再考虑使其成为多线程。如果您发现由于 cookie 的原因很难进行 m/t,那么请考虑使其成为多进程,也许使用 beanstalkd 进行通信。这个问题也在我的舒适区之外调查了 cookie stackoverflow.com/questions/189555/…。 :D
  • 非常感谢您的帮助,我的功能确实正常运行。它适用于单个帐户,这就是我现在研究多线程的原因。我会继续阅读,看看我能弄清楚什么。
猜你喜欢
  • 2020-01-03
  • 2012-10-17
  • 1970-01-01
  • 2011-10-02
  • 1970-01-01
  • 2013-06-19
  • 1970-01-01
  • 1970-01-01
  • 2011-03-14
相关资源
最近更新 更多