以每秒n个请求的速率执行命令

时间:2018-07-20 07:19:09

标签: python

我想以每秒可变数量的调用率执行方法调用。 n等于我要在一秒钟内执行的呼叫数量。 (而不是睡觉几秒钟,我需要在几毫秒内睡觉。) 我是这样做的:

While True:
    method()
    time.sleep(1/n)

现在,我想知道您是否知道一种更优雅,更有效的方法,或者这已经很好了吗?

2 个答案:

答案 0 :(得分:0)

我认为这将是最有效的方法,因为您可以分配多个任务并创建新线程而不会占用过多内存

import threading
n=3
def do_task():
  threading.Timer(1/n, do_task).start()
  print ("done")

do_task()

答案 1 :(得分:0)

如果您的方法只是一个单独的后台任务,则与逻辑的其他部分没有太多交互,例如该任务只是尝试从网络中获取一些东西。然后,您可以使用celery,但是如果程序中的某个函数不太容易分离,请绕开我的答案。

一个示例,在一秒钟内执行10次求和函数。

tasks.py

from celery import Celery

app = Celery('tasks',
             broker='redis://localhost',
             backend='redis://localhost')

@app.on_after_configure.connect
def setup_periodic_tasks(sender, **kwargs):
    # Calls add(1, 2) every 1/n seconds, here, n=10
    sender.add_periodic_task(0.1, add.s(1, 2), name='add every 1/n seconds')

@app.task
def add(x, y):
    print("running...", x, y)
    return x + y

如何使用?

首先安装redis和celery。

tasks.py文件夹中的。

在终端1中执行:celery -A tasks worker --loglevel=info

在终端2中,执行:celery -A tasks beat --loglevel=info

然后,add函数将每隔0.1秒运行一次。