每x秒循环一次,当条件不再满足时中断循环

2024-04-25 21:48:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用python编写一个discord机器人,我在使用下一个特性时遇到了困难。当消息:('user'joined)被读取时,bot应该每隔x秒开始循环函数,直到消息:('user'left)被读取

我在scratch文件中测试了不同的代码。它成功地在“用户”处开始循环。但是当('user'left)消息应该通过时,它不会接受新的参数,并永远继续循环

这两个版本看起来最有希望:

import re
import time



def message(servermessage):
    a = re.sub("[^\S]", " ", servermessage).split()
    if a[1] == 'joined':
        online = False

    elif a[1] == 'left':
        online = True

    while True:
        mcusername = a[0]
        print(mcusername, 0)
        if online:
            break
        time.sleep(2)



message('user joined')
time.sleep(10)
message('user left')

import re
import sched, time

s = sched.scheduler(time.time, time.sleep)

def message(servermessage):
    a = re.sub("[^\S]", " ", servermessage).split()
    def rewardplayer():
        s.enter(1, 1, rewardplayer)
        mcusername = a[0]
        print(mcusername, 0)
    if a[1] == 'joined':
        s.enter(1, 1, rewardplayer)
        s.run()

    elif a[1] == 'left':
        s.cancel()


message('user joined')
time.sleep(10)
print('done')
message('user left')


我的另一个要求是,当在前一个用户发出的('previoususer'left)消息之前发出('newuser'joined)消息时,它应该能够为不同的用户运行相同的循环

我为含糊不清的解释道歉。但我希望你能帮忙。提前谢谢


Tags: 用户importre消息messageiftimedef
1条回答
网友
1楼 · 发布于 2024-04-25 21:48:00

关于您的第一个代码: 这里有while,当在线为真时,应将其断开。但在这个循环中它永远不会改变。所以它类似于死锁

关于您的第二个代码: 您正在使用“调度程序”。通常这意味着您希望定期运行某些事件。但你的目标是在事件发生时做出反应。随时都可以。没有安排

所以在这里我可以推荐您使用异步python方式。 (请阅读有关asyncio的内容)

import re
import asyncio


async def process_msgs(queue):
    while True:
        msg = await queue.get()
        online, usr_name = parse_msg(msg)
        print(usr_name, 0)
        queue.task_done()


def parse_msg(msg):
    result = re.sub("[^\S]", " ", msg).split()
    action = result[1]
    usr_name = result[0]
    if action == 'joined':
        online = False
    elif action == 'left':
        online = True
    return online, usr_name


async def main():
    queue = asyncio.Queue()
    queue.put_nowait('usr joined')
    task = asyncio.create_task(process_msgs(queue))
    queue.put_nowait('usr left')
    await queue.join()
    task.cancel()

asyncio.run(main())

你可以这样使用它。 在那里我们有一个队列,在那里我们放置我们的事件。你们也可以通过无限的方式(监听socket或smthg——在这里你们会得到关于不同用户的消息)

我们有任务(worker),它在我们的“主要”功能处于活动状态时工作

相关问题 更多 >

    热门问题