处理需要协作任务的工作进程的Pythonic方式是什么?

13 投票
3 回答
607 浏览
提问于 2025-04-16 19:52

我现在正在学习Python,之前是用Java的背景,有个问题想问问。在Java中,我会用线程来处理的事情。

我的程序会用一些工作者定期从某个网络服务读取数据。每个工作者会在不同的时间定期调用这个网络服务。

根据我了解到的,最好是使用multiprocessing模块,把工作者设置成独立的进程,让它们自己去完成数据收集的任务。在Java中,我会用类似的方式,但会使用线程。虽然在Python中我也可以使用线程,但这样会影响到多核CPU的利用率。

我问题的核心是:这个网络服务有流量限制,也就是说,工作者每秒最多只能调用它x次。工作者应该怎么检查自己是否可以请求数据呢?

我有点困惑,不知道该用以下哪种方式:

  • 用管道来和某个“管理对象”沟通,这个管理对象负责监控每秒的总调用次数。
  • 用类似nmap的方式,在进程之间共享一些数据/值,来描述它们是否可以调用网络服务。
  • 用一个Manager()对象来监控每秒的调用次数,并通知工作者是否有权限进行调用。

当然,我想这可能取决于我如何跟踪每秒的调用次数。我想一个选项是让工作者调用某个其他对象上的一个函数,这个函数负责调用网络服务并记录当前的调用次数。另一个选项是让调用网络服务的函数在每个工作者内部,每次它们调用网络服务时,给一个管理对象发送消息。

欢迎大家分享想法!

3 个回答

0

这其实不是你问题的答案,而是解决你问题的另一种方法:你可以通过事件驱动的方式来处理请求,这样就能避免同步问题。比如,你可以使用Python的异步模块或者Twisted。虽然这样做不能让你充分利用多个CPU或核心,但在网络通信的情况下,这通常影响不大。

2

我觉得你会发现,multiprocessing 模块提供了一些你比较熟悉的结构。

你可能会觉得 multiprocessing.Queue 对于把你的工作线程和一个管理线程连接起来很有用,这个管理线程可以用来监控或者控制工作线程的速度。

2

把获取数据的工作交给一个单独的程序,这个程序会把请求排队,等到轮到它的时候再处理。

撰写回答