python-3.x - Python 中的 for 循环中的多线程
问题描述
假设我有一个 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)
解决方案
我认为像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)))
推荐阅读
- vue.js - 如何在 vue 3 中获取 this 实例?
- mongodb - 如何获取日期范围内的 MongoDB 条目,包括限制?
- android - BitmapFactory 为 ARGB 字节数组返回空位图 (Android)
- selenium - 从谷歌工作表和硒中提取数据以写入网页
- c++ - c++ 将结构推送到向量然后保存到输出文件的问题
- java - 在couchbase中保存为二进制的对象
- php - 尝试从 apache 服务器运行时 PHP intl 不起作用
- sql-server - Powershell Backup-SqlDatabase 备份快照而不是完整备份
- asp.net-core-mvc - 如何显示从视图到控制器的嵌套视图模型
- node.js - 如何在 nodejs 中运行任务,我得到 npm 运行错误