Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 如何与telethon客户端一起运行线程_Python 3.x_Telethon - Fatal编程技术网

Python 3.x 如何与telethon客户端一起运行线程

Python 3.x 如何与telethon客户端一起运行线程,python-3.x,telethon,Python 3.x,Telethon,我愿意使用基于时间的方法发送一些消息,我的方法是编写一个函数并在新线程中启动它,然后检查每秒必须发送的消息。i、 e.如下所示: async def function(): while True: time = datetime.datetime.now() await send_some_messages(time) 但是telethon需要我在它运行的同一个环路上等待。我知道我可以通过client.run_获得当前循环,直到_断开连接,但我不知道如何才能做到这一点 如果

我愿意使用基于时间的方法发送一些消息,我的方法是编写一个函数并在新线程中启动它,然后检查每秒必须发送的消息。i、 e.如下所示:

async def function():
  while True:
    time = datetime.datetime.now()
    await send_some_messages(time)
但是telethon需要我在它运行的同一个环路上等待。我知道我可以通过client.run_获得当前循环,直到_断开连接,但我不知道如何才能做到这一点


如果您能给我一种在不同线程中运行此函数的方法,但仍然能够使用telethon客户端发送消息,那就太好了。

您在使用时不需要使用线程,也不必使用。所做的只是保持事件循环运行,直到客户端断开连接。只要运行事件循环,Telethon就可以正常工作

创建客户端 客户端=。。。 对客户做任何事 @客户,在。。。 异步def handlerevent: ... 异步def主: 尽管如此: 例如,检查现在是否是发送消息的时间 ... 使用'await'将控制返回事件循环是关键。 我们给它一整秒钟的时间去做任何它需要的事情 处理更新、执行I/O等。 等待asyncio.sleep1 client.loop.run_直到_completemain 保持事件循环运行的其他方法也在使用中,不要忘记您可以或等待其中的许多方法……我鼓励您阅读asyncio文档。就像线程一样,文档也值得查看以了解如何使用它

作为补充说明,如果您真的需要线程,例如,您正在做CPU密集型工作,asyncio也会为您提供支持。但这些都不是电视马拉松的特例

如果您想更好地了解asyncio是如何工作的,这可能会帮助您了解


不用说,有更好的方法来检查何时使用堆和事件发送消息,直到下一次到期或另一个最长时间,而不仅仅是一秒钟,但这应该可以让您开始工作。

在使用时不需要使用线程,也不必使用线程。所做的只是保持事件循环运行,直到客户端断开连接。只要运行事件循环,Telethon就可以正常工作

创建客户端 客户端=。。。 对客户做任何事 @客户,在。。。 异步def handlerevent: ... 异步def主: 尽管如此: 例如,检查现在是否是发送消息的时间 ... 使用'await'将控制返回事件循环是关键。 我们给它一整秒钟的时间去做任何它需要的事情 处理更新、执行I/O等。 等待asyncio.sleep1 client.loop.run_直到_completemain 保持事件循环运行的其他方法也在使用中,不要忘记您可以或等待其中的许多方法……我鼓励您阅读asyncio文档。就像线程一样,文档也值得查看以了解如何使用它

作为补充说明,如果您真的需要线程,例如,您正在做CPU密集型工作,asyncio也会为您提供支持。但这些都不是电视马拉松的特例

如果您想更好地了解asyncio是如何工作的,这可能会帮助您了解


不用说,有更好的方法来检查何时使用堆和事件发送消息,直到下一次到期或另一个最长时间,而不仅仅是一秒钟,但这应该让您开始。

为什么要在线程中运行它?为什么要在线程中运行它?对于CPU密集型工作,您应该使用单独的进程而不是线程,至少在Python.org的Python实现中使用CPython。在CPython中,一次只能有一个线程执行Python字节码。@RolandSmith是的。但实际上,我的意思是,任何非平凡时间的阻塞都应该至少放在一个线程中,这通常比整个进程更容易、更轻量级。这仍将允许asyncio运行,而不会阻塞整个事件循环。是否有任何方法修改代码,使新传入消息的事件处理程序即使脚本正在运行while循环的Do whatever部分,仍将执行?我注意到,如果脚本正在执行Do Anwhere部分,那么此时接收到的所有消息都不会被处理。只要您足够频繁地将控制权让给事件循环,您仍然应该接收消息。也许你想把密集型的东西放在另一个线程中。对于CPU密集型的工作,你应该使用一个单独的进程而不是线程,至少在Python.org的Python实现中是这样。在CPython中,一次只能有一个线程执行Python字节码。@RolandSmith是的。但实际上,我的意思是,任何非平凡时间的阻塞都应该至少放在一个线程中,这通常比整个进程更容易、更轻量级。这仍然允许异步
io运行,而不是阻止整个事件循环。是否有任何方法修改代码,使新传入消息的事件处理程序即使在脚本运行while循环的Do whatever部分时仍将执行?我注意到,如果脚本正在执行Do Anwhere部分,那么此时接收到的所有消息都不会被处理。只要您足够频繁地将控制权让给事件循环,您仍然应该接收消息。也许你想,把密集的东西放在另一个线程中。