Python 以每秒n个请求的速率执行命令
我希望以每秒调用量的可变速率执行方法调用Python 以每秒n个请求的速率执行命令,python,Python,我希望以每秒调用量的可变速率执行方法调用n等于我希望在一秒钟内执行的调用量。(我需要几毫秒的睡眠时间,而不是几秒钟的睡眠时间。) 我是这样做的: While True: method() time.sleep(1/n) 现在我想知道您是否知道一种更优雅、更高效的方法,或者这已经很好了?我认为这将是最有效的方法,因为您可以分配多个任务并创建新线程,而不会使内存紧张 import threading n=3 def do_task(): threading.Timer(1/n,
n
等于我希望在一秒钟内执行的调用量。(我需要几毫秒的睡眠时间,而不是几秒钟的睡眠时间。)
我是这样做的:
While True:
method()
time.sleep(1/n)
现在我想知道您是否知道一种更优雅、更高效的方法,或者这已经很好了?我认为这将是最有效的方法,因为您可以分配多个任务并创建新线程,而不会使内存紧张
import threading
n=3
def do_task():
threading.Timer(1/n, do_task).start()
print ("done")
do_task()
如果您的方法只是一个单独的后台任务,那么它与您的逻辑的其他部分没有太多交互,例如,该任务只是尝试从web获取一些东西。然后你可以使用,但是如果你的程序里面有一个函数不那么容易分离,那么就绕过我的答案 例如,在一秒钟内执行求和函数10次 任务。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和芹菜
文件位于tasks.py
文件夹中
在终端1中执行:cellery-A tasks worker--loglevel=info
在termial 2中执行:芹菜-A任务节拍--loglevel=info
然后,函数
add
将每0.1秒运行一次。我不会说它不优雅,它是错误的:假设你的方法需要0.1秒,你想让它每秒运行10次,然后它只运行5次,这是错误的。在其他编程语言中,有Timer
类,它们提供了在每次达到某个时间限制时启动方法的机会。我建议您采用这种方法。但在这种情况下,我不能确定处理器是否能以我希望的速度执行命令行。对于像n=30
每秒呼叫这样的小速率,可能存在处理器无法跟踪的队列。虽然我只使用time.sleep
-方法,但只有一个线程,我可以确保处理器可以以我想要的速率运行: