Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 以每秒n个请求的速率执行命令_Python - Fatal编程技术网

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
-方法,但只有一个线程,我可以确保处理器可以以我想要的速率运行: