繁体   English   中英

python:多进程和请求

[英]python : Multiprocess and requests

这篇文章参考了我之前的帖子

在上一篇文章中,我解释说我有一个名为 Item 的 class object 这个项目 class 有一个方法,调用 make_request在服务器上发出 GET 请求。 现在,我已经实现了调用 make_request 的 X Item 对象 Item 对象将每 X 分钟调用一次该方法,但这些 make_request 必须独立调用。

包含 3 个项目的示例:

  • 14:00 - Item0.make_request
  • 14:01 - Item1.make_request
  • 14:02 - Item2.make_request
  • 14:03 - Item0.make_request
  • 14:04 - Item1.make_request
  • 14:05 - Item2.make_request
  • 14:06 - Item0.make_request
  • 14:07 - Item1.make_request
  • 14:08 - Item2.make_request
  • 14:09 - Item0.make_request
  • 14:10 - Item1.make_request
  • 14:11 - Item2.make_request
  • 14:12 - Item0.make_request
  • 14:13 - Item1.make_request
  • 14:14 - Item2.make_request...等

原理很简单,object Item_X的make_request方法必须独立于之前object Item_X-1的make_request方法调用。 实际上,make_request 方法必须从 M 分钟(每分钟)开始,例如 30 秒。 如果需要超过30秒才能得到方法的结果,那么它一定不能延迟下一个make_request(多进程和队列?)

我上一篇文章的答案有效,但不够强大:)

我需要的是可能的解决方案。 我想知道您是否有想法在 python3 中执行此操作。 你能给我一些建议(模块?)?

您可以使用apscheduler来实现这一点。 根据您的具体用例,您可以执行许多设置来执行此操作。 例如,将每个项目拆分为自己的工作:

import time
from datetime import datetime, timedelta

from apscheduler.schedulers.blocking import BlockingScheduler
from apscheduler.triggers.interval import IntervalTrigger


class Item:
    def __init__(self, name):
        self.name = name

    def make_request(self):
        print(f"{datetime.now()}: {self.name}")


items = [
    Item(name="Item0"),
    Item(name="Item1"),
    Item(name="Item2"),
]

scheduler = BlockingScheduler()  # blocks the main thread
for i, item in enumerate(items):
    scheduler.add_job(item.make_request,
                      IntervalTrigger(minutes=len(items)),  # every item is executed once per minute
                      next_run_time=datetime.now() + timedelta(minutes=i),  # delay items execution by a minute
                      )
scheduler.start()

样品 output:

2021-01-19 23:27:27.926250: Item0
2021-01-19 23:28:27.928920: Item1
2021-01-19 23:29:27.924316: Item2
2021-01-19 23:30:27.927307: Item0
2021-01-19 23:31:27.927305: Item1
2021-01-19 23:32:27.931385: Item2

如果make_request完成所需的时间多于项目数,则可以在完成后重新触发作业,或者允许同时执行同一作业 另一种可能性是使用CRON 触发器而不是使用next_run_time延迟来安排作业。

如果您绝对希望同步项目,那么您可以使用max_instances=len(items)每分钟运行一个作业,并维护标志以查看当前正在运行的项目。 但是,这可能容易出现竞争条件,并且通常需要更多的机械代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM