什么是处理必须协调其任务的工作进程的pythonic方法?

时间:2011-06-19 20:13:58

标签: python concurrency multiprocessing

我目前正在学习Python(来自Java背景),我对我在Java中使用线程的问题有疑问。

我的程序将使用工作人员定期从某些Web服务中读取一些数据。每个工作人员将定期在不同时间呼叫网络服务。

根据我的阅读,最好使用multiprocessing模块并将工作人员设置为继续执行数据收集任务的独立流程。在Java上我会做一些概念上类似的东西,但是使用线程。虽然看起来我可以在Python中使用线程,但我将失去多CPU利用率。

这是我的问题的核心:网络服务受到限制,即工作人员不得每秒呼叫超过x次。工人检查他们是否可以请求数据的最佳方式是什么?

我对是否应该使用以下内容感到困惑:

  • 管道作为一种与其他“管理对象”进行通信的方式,它可以监控每秒的总呼叫数。
  • nmap之类的内容,用于在描述他们是否可以调用Web服务的进程之间共享一些数据/值。
  • 一个Manager()对象,用于监控每秒的呼叫数,并通知工作人员是否有权拨打电话。

当然,我想这可能归结为我如何跟踪每秒的通话次数。我想一个选项是让工作人员在某个其他对象上调用一个函数,这会调用Web服务并记录当前的调用次数/秒。另一种选择是调用Web服务的函数在每个worker中生存,并且每次调用Web服务时都要向管理对象发送消息。

欢迎思考!

3 个答案:

答案 0 :(得分:2)

将检索委托给一个单独的进程,该进程将请求排队,直到轮到他们为止。

答案 1 :(得分:2)

我认为你会发现multiprocessing模块会为你提供一些相当熟悉的结构。

您可能会发现multiprocessing.Queue对于将工作线程连接回可以提供监视或限制的管理线程非常有用。

答案 2 :(得分:0)

不是您的问题的答案,而是解决问题的另一种方法:您可以在执行事件驱动请求时摆脱同步问题,例如:使用Python async moduleTwisted。您不会受益于多个CPU /核心,但在网络通信环境中通常可以忽略不计。