我如何创建一个任务来检查列表中的实时更改?
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文档,但它不是很友好。我会去找一些教程。
我有一个问题,我不太确定如何做到这一点。我尽了最大努力进行搜索,但不知道(除了一段时间的 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文档,但它不是很友好。我会去找一些教程。