运行 一次列表中的代码 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.

的维护者