运行 一次列表中的代码 python
Running codes from a list once python
这里我有一个代码,但我希望所有这些代码同时 运行 而不是每个代码都先等待其他代码完成 运行。
from telegram import *
from telegram.ext import *
import telegram
IDs = [1111,2222,3333,4444]
def start(update,context) -> None:
while True:
for user in IDs:
context.bot.send_message(user,f"hello {user}")
有没有办法一次性向所有这些用户发送消息,而无需等待发送到 1111、2222、3333 和 4444...?
有一个巨大的警告,是的。您可以使用 asyncio 如果 对 send_message
的调用无法阻止进程。这提供并发性而不是并行性。它看起来像这样:
import asyncio
async def main():
await start(None, None)
async def send_message(user, msg):
"""Has to be non-blocking.
That is, there has to be a way to instruct the loop to come back and
check later. For instance, if this is an api that returns a task
handle, you can call `asyncio.sleep(1)` between every call to check
the task status. That way the thread can move back to the loop for 1
second at a time.
"""
print(f"{msg} {user}")
async def start(update, context) -> None:
await asyncio.gather(
*[
asyncio.create_task(send_message(user, "hello"))
for user in [1111, 2222, 3333, 4444]
]
)
if __name__ == "__main__":
asyncio.run(main())
但是,如果对 send_message
的调用在继续之前等待响应,那么这对您的情况可能根本不起作用。
这里是 multiprocessing vs multithreading vs asyncio in Python 3
的一个很好的答案
PTB 附带一个 built-in 工具,用于 运行 I/O 线程池中的绑定任务 - Dispatcher.run_async
. Note that this has nothing to do with asyncio
. Please see this wiki page 了解更多详细信息。
请注意,最近发布的 pre-release v20.0a0 将 asyncio
引入 PTB,因此从 v20.x 开始, 确实适用。
免责声明:我目前是 python-telegram-bot
.
的维护者
这里我有一个代码,但我希望所有这些代码同时 运行 而不是每个代码都先等待其他代码完成 运行。
from telegram import *
from telegram.ext import *
import telegram
IDs = [1111,2222,3333,4444]
def start(update,context) -> None:
while True:
for user in IDs:
context.bot.send_message(user,f"hello {user}")
有没有办法一次性向所有这些用户发送消息,而无需等待发送到 1111、2222、3333 和 4444...?
有一个巨大的警告,是的。您可以使用 asyncio 如果 对 send_message
的调用无法阻止进程。这提供并发性而不是并行性。它看起来像这样:
import asyncio
async def main():
await start(None, None)
async def send_message(user, msg):
"""Has to be non-blocking.
That is, there has to be a way to instruct the loop to come back and
check later. For instance, if this is an api that returns a task
handle, you can call `asyncio.sleep(1)` between every call to check
the task status. That way the thread can move back to the loop for 1
second at a time.
"""
print(f"{msg} {user}")
async def start(update, context) -> None:
await asyncio.gather(
*[
asyncio.create_task(send_message(user, "hello"))
for user in [1111, 2222, 3333, 4444]
]
)
if __name__ == "__main__":
asyncio.run(main())
但是,如果对 send_message
的调用在继续之前等待响应,那么这对您的情况可能根本不起作用。
这里是 multiprocessing vs multithreading vs asyncio in Python 3
的一个很好的答案PTB 附带一个 built-in 工具,用于 运行 I/O 线程池中的绑定任务 - Dispatcher.run_async
. Note that this has nothing to do with asyncio
. Please see this wiki page 了解更多详细信息。
请注意,最近发布的 pre-release v20.0a0 将 asyncio
引入 PTB,因此从 v20.x 开始,
免责声明:我目前是 python-telegram-bot
.