Python 中的 for 循环中的多线程

Posted

技术标签:

【中文标题】Python 中的 for 循环中的多线程【英文标题】:Multithreading in Python within a for loop 【发布时间】:2021-02-23 18:21:20 【问题描述】:

假设我有一个 Python 程序,如下所示:

import time

def send_message_realtime(s):
    print("Real Time: ", s)
    
def send_message_delay(s):
    time.sleep(5)
    print("Delayed Message ", s)

for i in range(10):
    send_message_realtime(str(i))
    time.sleep(1)
    send_message_delay(str(i))

我在这里尝试做的是某种多线程,这样我的 main for 循环的内容就可以继续执行,而不必等待延迟函数中由 time.sleep(5) 引起的延迟。

理想情况下,我正在处理的代码如下所示。我从某个 API 端点收到一条消息,我想实时发送到特定的电报频道(付费订阅者),但我也想通过将其延迟 10 分钟或 600 秒将其发送到另一个频道,因为它们是免费会员。我面临的问题是,我想继续将消息实时发送给我的付费订阅者,并为延迟消息创建一个新线程/进程,该消息独立于主 while 循环运行。

def send_message_realtime(my_realtime_message):
    telegram.send(my_realtime_message)


def send_message_delayed(my_realtime_message):
    time.sleep(600)
    telegram.send(my_realtime_message)

while True:
    my_realtime_message = api.get()
    send_message_realtime(my_realtime_message)
    send_message_delayed(my_realtime_message)

【问题讨论】:

【参考方案1】:

我认为像 ThreadPoolExecutor 这样的东西可以满足您的需求:

import time
from concurrent.futures.thread import ThreadPoolExecutor


def send_message_realtime(s):
    print("Real Time: ", s)


def send_message_delay(s):
    time.sleep(5)
    print("Delayed Message ", s)


def work_to_do(i):
    send_message_realtime(str(i))
    time.sleep(1)
    send_message_delay(str(i))


with ThreadPoolExecutor(max_workers=4) as executor:
    for i in range(10):
        executor.submit(work_to_do, i)

max_workers 将是在给定时刻可能具有的并行消息的数量。

除了多线程解决方案,您还可以使用多处理解决方案,例如

from multiprocessing import Pool
...
with Pool(4) as p:
    print(p.map(work_to_do, range(10)))  

【讨论】:

以上是关于Python 中的 for 循环中的多线程的主要内容,如果未能解决你的问题,请参考以下文章

Windows 中的多线程 - 创建函数指针数组时出错

python循环怎么用多线程去运行

java for循环中创建线程池

对 C# 循环中的多线程感到困惑 [重复]

foreach循环中的多线程C#

python中的多线程