Python多线程运行带多个参数的函数

部署运行你感兴趣的模型镜像

在python中经常会到用多线程处理某个函数来缩短运行时间。

from multiprocessing import Pool

def work(x):
    return x+1
pool = Pool(processes=4) # 4个线程
x = [1,2,3,4,5,6]
results = pool.map(work, x)
print (results)

运行上面的程序就会多线程处理并打印出输入x的计算结果。

但是这个函数仅允许函数的输入变量为1,如果函数需要多个参数输入,那个就无法用上面的程序。比如:

def work(x, y):
    return x + y

遇到这种情况我们有一下几种处理方法:

1). 用partial函数提取主要的一个参数固定其他参数
比如,我们想用x去加一个固定值,那么我们就认为x是主要参数,固定y:

'''
学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
from functools import partial

partial_work = partial(work, y=1) # 提取x作为partial函数的输入变量
results = pool.map(partial_work, x)

2). 将多个输入变量打包到一个参数

x = [1,2,3,4,5,6]
y = [1,1,1,1,1,1]
x_y = zip(x, y)
results = pool.map(work, x_y)

3). 使用pathos包下的multiprocessing
这个包是使用dill的multiprocessing的一个fork,允许多参数输入:

from pathos.multiprocessing import ProcessingPoll as Pool

pool = Pool(4)
results = pool.map(work, x, y)

总结:

当函数的参数在不同时候的输入均不同,那么前一种就不太合适。而在后面两种中,用pathos会更简单些,不太容易报pickling error。

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think>我们需要创建多个线程,每个线程运行不同的函数。在Python中,可以使用`threading`模块来实现。 注意:由于GIL(全局解释器锁)的存在,Python多线程适合I/O密集型任务,而不适合CPU密集型任务。 步骤: 1. 导入threading模块。 2. 定义不同的函数,这些函数将被不同的线程执行。 3. 创建线程对象,每个线程指定不同的目标函数。 4. 启动线程。 5. 等待所有线程完成(可选)。 示例代码: 假设我们有两个函数:function1和function2,我们将分别创建两个线程来运行它们。</think># Python多线程:每个线程运行不同函数Python中实现多线程运行不同函数,可以使用`threading`模块。以下是完整解决方案: ```python import threading import time import random # 定义三个不同的函数 def task_alpha(): """函数1: 模拟数据处理""" thread_name = threading.current_thread().name print(f"[{thread_name}] 开始处理数据...") time.sleep(random.uniform(0.5, 2.0)) print(f"[{thread_name}] 数据处理完成!") def task_beta(): """函数2: 模拟网络请求""" thread_name = threading.current_thread().name print(f"[{thread_name}] 发起网络请求...") time.sleep(random.uniform(1.0, 3.0)) print(f"[{thread_name}] 收到响应!") def task_gamma(): """函数3: 模拟文件操作""" thread_name = threading.current_thread().name print(f"[{thread_name}] 开始写入文件...") time.sleep(random.uniform(0.8, 1.5)) print(f"[{thread_name}] 文件写入成功!") # 创建并启动线程 def run_threads(): # 创建线程对象,每个线程分配不同函数 threads = [ threading.Thread(target=task_alpha, name="Thread-Alpha"), threading.Thread(target=task_beta, name="Thread-Beta"), threading.Thread(target=task_gamma, name="Thread-Gamma") ] # 启动所有线程 for t in threads: t.start() print(f"已启动线程: {t.name}") # 等待所有线程完成 for t in threads: t.join() print("所有线程执行完毕!") # 参数传递的函数示例 def task_with_args(name, duration): """参数的线程函数""" print(f"[{threading.current_thread().name}] 开始执行任务: {name}") time.sleep(duration) print(f"[{threading.current_thread().name}] 任务 {name} 完成 ({duration}秒)") def run_threads_with_args(): """创建参数的不同线程函数""" tasks = [ ("数据库备份", 1.5), ("日志分析", 2.0), ("缓存刷新", 0.8) ] threads = [] for i, (task_name, duration) in enumerate(tasks): thread = threading.Thread( target=task_with_args, args=(task_name, duration), name=f"Worker-{i+1}" ) threads.append(thread) thread.start() for t in threads: t.join() print("所有参数线程执行完成!") if __name__ == "__main__": print("=== 基本多线程示例 ===") run_threads() print("\n=== 参数多线程示例 ===") run_threads_with_args() ``` ## 代码解释 ### 1. 线程创建 - **Thread类**:使用`threading.Thread`创建线程对象 - **target参数**:指定线程运行函数 - **name参数**:为线程命名便于识别 - **args参数**:向线程函数传递参数 ### 2. 线程管理 - **start()**:启动线程执行 - **join()**:等待线程完成 - **current_thread()**:获取当前线程信息 ### 3. 函数设计 - **不同函数**:每个线程执行独立的业务逻辑 - **随机延迟**:使用`time.sleep()`和`random.uniform()`模拟不同执行时间 - **函数**:通过`args`传递参数给线程函数 ### 4. 输出示例 ``` === 基本多线程示例 === 已启动线程: Thread-Alpha [Thread-Alpha] 开始处理数据... 已启动线程: Thread-Beta [Thread-Beta] 发起网络请求... 已启动线程: Thread-Gamma [Thread-Gamma] 开始写入文件... [Thread-Gamma] 文件写入成功! [Thread-Alpha] 数据处理完成! [Thread-Beta] 收到响应! 所有线程执行完毕! === 参数多线程示例 === [Worker-1] 开始执行任务: 数据库备份 [Worker-2] 开始执行任务: 日志分析 [Worker-3] 开始执行任务: 缓存刷新 [Worker-3] 任务 缓存刷新 完成 (0.8秒) [Worker-1] 任务 数据库备份 完成 (1.5秒) [Worker-2] 任务 日志分析 完成 (2.0秒) 所有参数线程执行完成! ``` ## 多线程应用场景 1. **并行处理**:同时执行多个独立任务 2. **I/O密集型操作**:网络请求、文件读写等 3. **后台任务**:日志记录、数据备份等 4. **响应式UI**:主线程保持响应,后台线程处理耗时操作
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值