我目前正在学习Python(来自Java背景),我对我在Java中使用线程的问题有疑问。
我的程序将使用工作人员定期从某些Web服务中读取一些数据。每个工作人员将定期在不同时间呼叫网络服务。
根据我的阅读,最好使用multiprocessing
模块并将工作人员设置为继续执行数据收集任务的独立流程。在Java上我会做一些概念上类似的东西,但是使用线程。虽然看起来我可以在Python中使用线程,但我将失去多CPU利用率。
这是我的问题的核心:网络服务受到限制,即工作人员不得每秒呼叫超过x次。工人检查他们是否可以请求数据的最佳方式是什么?
我对是否应该使用以下内容感到困惑:
nmap
之类的内容,用于在描述他们是否可以调用Web服务的进程之间共享一些数据/值。Manager()
对象,用于监控每秒的呼叫数,并通知工作人员是否有权拨打电话。当然,我想这可能归结为我如何跟踪每秒的通话次数。我想一个选项是让工作人员在某个其他对象上调用一个函数,这会调用Web服务并记录当前的调用次数/秒。另一种选择是调用Web服务的函数在每个worker中生存,并且每次调用Web服务时都要向管理对象发送消息。
欢迎思考!
答案 0 :(得分:2)
将检索委托给一个单独的进程,该进程将请求排队,直到轮到他们为止。
答案 1 :(得分:2)
我认为你会发现multiprocessing
模块会为你提供一些相当熟悉的结构。
您可能会发现multiprocessing.Queue
对于将工作线程连接回可以提供监视或限制的管理线程非常有用。
答案 2 :(得分:0)
不是您的问题的答案,而是解决问题的另一种方法:您可以在执行事件驱动请求时摆脱同步问题,例如:使用Python async module或Twisted。您不会受益于多个CPU /核心,但在网络通信环境中通常可以忽略不计。