如何让两个客户端同时运行



我有两个不同的Telegram聊天。当第一个聊天程序收到消息时,它应该等待来自另一个聊天程序的消息。在第二次聊天接收一条消息,这应该停止运行,夺回第一聊天。

例:它应该每次重复一次。第一个聊天收到一条消息
  1. 第一次聊天:收到消息
  2. 第一次聊天:停止,等待第二次聊天
  3. 第二次聊天:开始
  4. 第二次聊天:只接收一条消息
  5. 第二次聊天:stop
  6. 第一次聊天:从第二次聊天中检索消息并继续。

这是我的代码。我使用python 3.9, Telethon和asyncio

client = TelegramClient('1', api_id, api_hash)
client2 = TelegramClient('2', api_id, api_hash)
@client.on(events.NewMessage(chats=yyyyyyy))
async def my_event_handler(event):
first_message = event.raw_text
print(first_message)
second_message = await second()
print(second_message)
client.start()
client.run_until_disconnected()
@client2.on(events.NewMessage(chats=xxxxxxx))
async def second(event):
print("I'm in")
second_m= event.raw_text
return second_m
await client2.disconnect()
client2.start()
client2.run_until_disconnected()

它从不在控制台中打印"I'm in"。我想创建一个全局共享变量,但这样一来,Client1永远不会知道它何时被更新。

更新我试过只使用任务,之后,我试过asyncio。收集,但我再也没有回到第一个循环客户。在控制台中,总是只打印第二条消息1次(因为它停留在client2事件中)。我不会回到client1并继续循环。

client = TelegramClient('1', api_id, api_hash)
client2 = TelegramClient('2', api_id, api_hash)
@client.on(events.NewMessage(chats=yyyyyyy))
async def my_event_handler(event):
first_message = event.raw_text
print(first_message)
second_message = await asyncio.gather(task)
print(second_message)
client.start()
client.run_until_disconnected()
@client2.on(events.NewMessage(chats=xxxxxxx))
async def second(event):
print("I'm in")
second_m= event.raw_text
return second_m
await client2.disconnect()
client2.start()
client2.run_until_disconnected()
task = client2.loop.create_task(second(events.client2))

更新2

我还没有找到任何解决这个问题的方法。实际上,我已经解决了它只有async.sleep()函数和全局变量。这样,我就改变了msg的值。我想做的是避免asyncio.sleep(),并找到一种方法来"唤醒"。CLIENT1 CLIENT2断开连接后,继续它的指令(在这种情况下:打印味精),直到一个新的事件。
msg = ""
@client.on(events.NewMessage(chats=xxxxxxxxx))
async def my_event_handler(event):
first_message = event.raw_text
print(first_message)
global client2
await client2.start()
await asyncio.sleep(5) #NOW IS SLEEPING FOR 5 SECONDS
print("Time ended")
print(msg)

@client2.on(events.NewMessage(chats=xxxxxx))
async def second(event):
print("I'm in")
global msg
msg = event.raw_text
await client2.disconnect()
client.start()

client.run_until_disconnected运行asyncio事件循环直到客户端未连接。只要循环正在运行,您不需要使用此方法。下面是做你需要的事情的最简单的方法:

client = TelegramClient('1', api_id, api_hash)
client2 = TelegramClient('2', api_id, api_hash)
@client.on(events.NewMessage(chats=yyyyyyy))
async def my_event_handler(event):
first_message = event.raw_text
print(first_message)
client.start()
@client2.on(events.NewMessage(chats=xxxxxxx))
async def second(event):
second_message = event.raw_text
print(second_message)
client2.start()
client.loop.run_forever()

请阅读asyncio文档,了解管理async代码的不同方式,包括asyncio.gather等概念,它们也可以在这里工作。

嘿,我试图运行一个机器人和一个客户端,所以这为我工作,希望它对你有用

import asyncio
client = TelegramClient('1', api_id, api_hash)
client2 = TelegramClient('2', api_id, api_hash)

loop = asyncio.get_event_loop()
client1.start()
client2.start()
loop.run_forever()

尝试一下多处理python库吗?

def run_in_parallel(fn, args):
proc = []
for client in clients_work.keys():
p = Process(target=fn, args=args)
p.start()
proc.append(p)
for p in proc:
p.join()

最新更新