多线程/异步I / O.

时间:2013-01-31 01:13:59

标签: python multithreading io urllib2

我有一个概念性的问题。

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

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 个答案:

答案 0 :(得分:0)

Gevent是一个高性能的绿色线程实现,有一个例子。

我不确定对于同一服务器的不同帐户执行此操作是否意味着处理网址处理的工作人员功能不同 - 实际上每个帐户的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-queue上以供另一个进程处理。 节省必须处理线程,这在非平凡的应用程序中始终是一件好事。