如何让两个并行函数互相对话?

问题描述 投票:0回答:1

我想停止使用 Telegram 机器人运行 python 脚本。我设置了“电报读取”功能和“停止”功能,并使用多处理并行运行它们。我需要“停止”功能来读取“电报读取”功能更新的消息列表,但我真的不知道该怎么做......有人可以帮忙吗?我知道有更好的方法可以在不使用多重处理的情况下实现此目的,但我想了解如何以这种方式进行操作以供将来使用。 这是代码的简化:

from multiprocessing import Process
from telethon import TelegramClient, events
import time

messages = []


def telegram_read():
    client = TelegramClient('anon', API_ID, API_HASH)

    @client.on(events.NewMessage(chats=BOT_NAME))
    async def my_event_handler(event):
        messages.append(event.raw_text)

    client.start()
    client.run_until_disconnected()


def check():
    while True:
        if 'STOP' in messages:
            stop_script()
            return
        time.sleep(10)


if __name__ == "__main__":
    p1 = Process(target=telegram_read)
    p1.start()
    p2 = Process(target=check)
    p2.start()
    p1.join()
    p2.join()

我对 python 还很陌生(我已经编码了 1 个月),所以对这些错误感到抱歉。谢谢!

python multiprocessing telegram-bot
1个回答
0
投票

这是一种方法。如下更新您的

check()
方法,它将提取并检查更新的消息以查看
STOP
是否在其中。如果找到,它将把
stop_flag
设置为
True
并跳出循环:

from multiprocessing import Process, Queue
from telethon import TelegramClient, events
import time

def telegram_read(api_id, api_hash, bot_name, messages_queue, stop_flag):
    client = TelegramClient('anon', api_id, api_hash)

    @client.on(events.NewMessage(chats=bot_name))
    async def my_event_handler(event):
        message_text = event.raw_text
        messages_queue.put(message_text)

    client.start()
    client.run_until_disconnected()
    stop_flag.put(True)  # Signal to stop the check process


def check(messages_queue, stop_flag):
    while True:
        if not messages_queue.empty():
            message = messages_queue.get()
            print(f"Received message: {message}")

            if 'STOP' in message:
                print("Stopping...")
                stop_flag.put(True)
                break

        time.sleep(10)


if __name__ == "__main__":

    messages_queue = Queue()
    stop_flag = Queue()

    p1 = Process(target=telegram_read, args=(api_id, api_hash, bot_name,
                 messages_queue, stop_flag))
    p2 = Process(target=check, args=(messages_queue, stop_flag))

    p1.start()
    p2.start()

    p1.join()
    p2.join()
© www.soinside.com 2019 - 2024. All rights reserved.