我如何创建一个任务来检查列表中的实时更改?

How can i create a task, that checks for real-time changes on a list?

我有一个问题,我不太确定如何做到这一点。我尽了最大努力进行搜索,但不知道(除了一段时间的 True 任务之外)我该怎么做,我想要什么。所以我目前有一个 messages 的列表,我的 python 机器人需要从服务器 X 传输到许多其他服务器(比如队列系统)。

那么我的任务应该做什么? 我需要一个类似“实时”的东西 (async) 任务,它每次都会检查新的列表中的条目。如果列表中不再有任何内容,则应等待新项目。我尝试了 while True: 任务,但我认为这对我的机器人的性能来说不是一个好主意。

这是我当前 view/editing 队列的功能:

global_queue = []

async def Queue(action=None, globalmsg=None, original=None, code=None):

    if action is not None:
        if action == "add":
            global_queue.append((globalmsg, original, code))

        elif action == "remove":
            global_queue.remove((globalmsg, original, code))

    else:
        return global_queue

那是我的 while True: 任务,我认为这对我的机器人性能不是很有效,没有 await asyncio.sleep() 我什至无法启动机器人。

def __init__(self, client):
    self.client = client

    client.loop.create_task(self.on_queue())

async def on_queue(self):
    await self.client.wait_until_ready()

    while True:
        await asyncio.sleep(1)

        queue = await Queue()
        if len(queue) >= 1:
           await Queue("remove", item[0], item[1], item[2])
           # do something

那么我怎样才能摆脱 while True: 任务并使用更有效的方法呢? 重要提示:因为是队列系统,应该不可能到运行两次任务。

你要找的是队列!

使用 ayncio.Queue 而不是列表。

要创建队列,请使用:

queue = asyncio.Queue()

要将项目放入队列,请使用:

await queue.put(item)

从队列中获取和删除项目:

item = await queue.get()

或者只是

await queue.get()

如果您不需要该物品

如果队列为空,则任务暂停,直到有一些项目。 如果您希望队列具有最大大小,请将最大大小作为参数传递给构造函数。然后,如果队列已满,put() 调用也会挂起任务,直到队列中有 space。

你可以阅读asyncio文档,但它不是很友好。我会去找一些教程。