我想停止使用 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 个月),所以对这些错误感到抱歉。谢谢!
这是一种方法。如下更新您的
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()