Python:类编程和排队 [英] Python : class programming and queuing

查看:59
本文介绍了Python:类编程和排队的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我遇到了问题.我找到了一个我在下面解释的解决方案,但我想要一些正确的建议来解决它.

问题来了:

我有一个名为 Item 的类对象.这个Item 有一个方法,调用make_request,它在服务器上发出一个GET 请求,并保存结果.现在,我已经实现了 3 个调用 make_requestItem 对象.Item 对象将每 3 分钟调用一次该方法,但是这些 make_requests 必须比前一个对象的调用延迟 1 分钟.

示例:

  • 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...等

我实际上做的是一个 while 循环,我在其中检查时间分钟并调用正确对象的方法.

from datetime import datetime项目0 = 项目(名称=项目0")项目 1 = 项目(名称 =项目 1")项目 2 = 项目(名称 =项目 2")为真:如果 str(datetime.now().time.minute[-1]) 在 ['0', '3', '6']:Item0.make_request()如果 str(datetime.now().time.minute[-1]) 在 ['1', '4', '7']:Item1.make_request()如果 str(datetime.now().time.minute[-1]) 在 ['2', '5', '8']:Item2.make_request()

这是一个解决方案,但它不干净,我不喜欢它.它也缺少1分钟.我在考虑使用队列.

我在等你的建议:)

更强大的东西

非常感谢您的回答.我为第一个问题找到了一个很好的解决方案.

现在,我问自己是否可以在相同的上下文中使用队列.这个想法是独立于前一个 make_request 的结果调用 make_request.

例如:在 14:00:00 我调用 Item0.make_request.不幸的是,获得Item0.make_request 的结果需要60 多秒,但我希望我的Item1.make_request 在14:01:00 被独立调用.>

有时会发生

解决方案

通常,当你有多个项目要做同样的事情时,最好把它们放在一个列表中:

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

然后,不需要特殊的逻辑来查看当前分钟是哪一分钟.只需按顺序运行它们,延迟 1 分钟:

虽然为真:对于项目中的项目:item.make_request()time.sleep(60) # 60 秒

有一个缺点,您可能会也可能不会在意:实际上,两个请求之间的时间将是 60 秒加上 make_request() 所花费的时间.有很多方法可以避免这种情况,但您可能并不关心这些细节.

I facing a problem. I found a solution I'm explaining below but I want some advice aout to right way to resolve it.

Here is the problem:

I have a class object called Item. This Item has a method, call make_request which makes a GET request on a server, and save the result. Now, I have implemented 3 Item object which calls make_request. The Item objects gonna call the method each 3 minutes, but these make_requests must be delayed by 1 minutes from the previous object's call.

Example :

  • 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 ... etc

What I do actully is a while loop where I check the time minute and call the right object's method.

from datetime import datetime

Item0 = Item(name="Item0")
Item1 = Item(name="Item1")
Item2 = Item(name="Item2")

while True:
   if str(datetime.now().time.minute[-1]) in ['0', '3', '6']: 
      Item0.make_request()
   if str(datetime.now().time.minute[-1]) in ['1', '4', '7']: 
      Item1.make_request()
   if str(datetime.now().time.minute[-1]) in ['2', '5', '8']: 
      Item2.make_request()

This is a solution, but it's not clean and I don't like it. It is also missing 1 minute. I was thinking about using Queue.

I'm waiting for your advice :)

EDIT : something more robust

Thank a lot for your answers. I found a good solution for the first problem.

Now, I'm asking myself if I can, in the same context, use a Queue. The idea is to call the make_request independently of the result of the previous make_request.

For example: At 14:00:00 I call Item0.make_request. Unfortunately, it takes more than 60 seconds to get the result of Item0.make_request but I want my Item1.make_request to be called independently at 14:01:00.

It happens sometimes

解决方案

Usually, when you have a number of items, on which the same thing is to be done, it is best to keep them in a list:

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

Then, no special logic is needed to see which the current minute is. Just run them sequentially with 1 minute delay:

while True:
    for item in items:
        item.make_request()
        time.sleep(60)  # 60 seconds

There is one drawback, about which you may or may not care: as it is, the time between two requests will be 60 seconds plus the time taken by make_request(). There are ways to avoid that, but perhaps you don't care about such details.

这篇关于Python:类编程和排队的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆