Python使用线程池传递多个参数的几种方法

 更新时间:2026年04月14日 09:34:14   作者:独隅  
本文介绍了在Python中使用线程池传递多个参数的四种方法,并推荐使用stmap方式,这种方法代码清晰易读,参数传递灵活,易于维护和扩展,适用于为每个设备指定不同参数的场景,需要的朋友可以参考下

在 Python 中使用线程池传递多个参数有多种方法,以下是几种常用的方式:

方法一:使用zip和*解包

from concurrent.futures import ThreadPoolExecutor

def worker(phone, x, y, duration):
    print(f"设备: {phone}, 位置: ({x}, {y}), 时长: {duration}")
    # 这里执行实际的投屏操作

def thread_pool_with_zip():
    phones = ["172.26.101.164", "172.26.101.112", "172.26.101.113"]
    x_positions = [100, 500, 900]  # X坐标
    y_positions = [100, 100, 100]  # Y坐标
    durations = [20, 25, 30]  # 投屏时长
    
    with ThreadPoolExecutor(max_workers=3) as executor:
        # 使用zip打包参数,然后解包传递给worker函数
        executor.map(worker, phones, x_positions, y_positions, durations)

方法二:使用partial函数固定部分参数

from concurrent.futures import ThreadPoolExecutor
from functools import partial

def worker(phone, x, y, duration):
    print(f"设备: {phone}, 位置: ({x}, {y}), 时长: {duration}")

def thread_pool_with_partial():
    phones = ["172.26.101.164", "172.26.101.112", "172.26.101.113"]
    
    # 固定x, y, duration参数
    fixed_worker = partial(worker, x=100, y=100, duration=20)
    
    with ThreadPoolExecutor(max_workers=3) as executor:
        executor.map(fixed_worker, phones)

方法三:使用字典或元组包装参数

from concurrent.futures import ThreadPoolExecutor

def worker(params):
    phone = params['phone']
    x = params['x']
    y = params['y']
    duration = params['duration']
    print(f"设备: {phone}, 位置: ({x}, {y}), 时长: {duration}")

def thread_pool_with_dict():
    # 参数列表
    params_list = [
        {'phone': "172.26.101.164", 'x': 100, 'y': 100, 'duration': 20},
        {'phone': "172.26.101.112", 'x': 500, 'y': 100, 'duration': 25},
        {'phone': "172.26.101.113", 'x': 900, 'y': 100, 'duration': 30}
    ]
    
    with ThreadPoolExecutor(max_workers=3) as executor:
        executor.map(worker, params_list)

方法四:使用starmap(推荐)

from concurrent.futures import ThreadPoolExecutor

def worker(phone, x, y, duration):
    print(f"设备: {phone}, 位置: ({x}, {y}), 时长: {duration}")

def thread_pool_with_starmap():
    # 参数元组列表
    args_list = [
        ("172.26.101.164", 100, 100, 20),
        ("172.26.101.112", 500, 100, 25),
        ("172.26.101.113", 900, 100, 30)
    ]
    
    with ThreadPoolExecutor(max_workers=3) as executor:
        # 使用starmap解包元组参数
        executor.map(lambda args: worker(*args), args_list)

在您的代码中应用

修改您的代码以支持多参数传递:

def Scrcpy(params):
    """接收参数字典的投屏函数"""
    phone = params['phone']
    x = params.get('x', 100)  # 默认值
    y = params.get('y', 100)  # 默认值
    duration = params.get('duration', 20)  # 默认值
    
    RestartScrcpy(phone)
    time.sleep(5)
    phone_num = Phone_number(phone)
    
    try:
        _IP_CONNEXT = f"{phone}:12324"
        run_cmd(f"adb connect {_IP_CONNEXT}")  
        # 添加窗口位置参数
        run_cmd(f'scrcpy -s {_IP_CONNEXT} --time-limit {duration} --max-size=1280 --window-title={phone_num} --window-x={x} --window-y={y}') 
        run_cmd(f"adb disconnect {_IP_CONNEXT}")
    except Exception as e:
        log(logging.ERROR, f"Scrcpy: {e}")

def thread_pool_multiple_params():
    # 定义设备及其参数
    device_configs = [
        {'phone': "172.26.101.164", 'x': 100, 'y': 100, 'duration': 20},
        {'phone': "172.26.101.112", 'x': 800, 'y': 100, 'duration': 25},
        # 添加更多设备...
    ]
    
    try:
        with ThreadPoolExecutor(max_workers=len(device_configs)) as executor:
            executor.map(Scrcpy, device_configs)
    except Exception as e:
        log(logging.ERROR, f"线程池异常: {e}")

# 在主函数中使用
if __name__ == '__main__':
    while True:
        if len(PHONES) >= 2:
            selected = random.sample(PHONES, 2)
            log(logging.DEBUG, f"--> 随机选取的投屏设备:{selected}")
            
            # 为每个设备创建参数配置
            configs = []
            for i, phone in enumerate(selected):
                configs.append({
                    'phone': phone,
                    'x': 100 + i * 700,  # 水平排列窗口
                    'y': 100,
                    'duration': 20
                })
            
            thread_pool_multiple_params()
            time.sleep(5)
        # ... 其他条件判断

使用进程池(multiprocessing.Pool)的多参数传递

import multiprocessing

def worker(args):
    phone, x, y, duration = args
    print(f"设备: {phone}, 位置: ({x}, {y}), 时长: {duration}")

def multiprocessing_pool_multiple_params():
    args_list = [
        ("172.26.101.164", 100, 100, 20),
        ("172.26.101.112", 500, 100, 25),
        ("172.26.101.113", 900, 100, 30)
    ]
    
    with multiprocessing.Pool(processes=3) as pool:
        pool.map(worker, args_list)

推荐方案

对于您的场景,我推荐使用方法四(starmap方式),因为它:

  1. 代码清晰易读
  2. 参数传递灵活
  3. 易于维护和扩展

这样您就可以为每个设备指定不同的窗口位置、投屏时长等参数了。

到此这篇关于Python使用线程池传递多个参数的几种方法的文章就介绍到这了,更多相关Python线程池传递多个参数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 只用40行Python代码就能写出pdf转word小工具

    只用40行Python代码就能写出pdf转word小工具

    今天咱们介绍一个pdf转word的免费小工具,满足这么一个不常见但是偶尔会出来烦人的需求文中有非常详细的代码示例,对小伙伴们很有帮助,需要的朋友可以参考下
    2021-05-05
  • Python实现读取文本文件并转换为pdf

    Python实现读取文本文件并转换为pdf

    这篇文章主要为大家详细介绍了如何使用Python简便快捷地完成TXT文件到PDF文档的转换,满足多样化的文档处理需求,感兴趣的小伙伴可以参考下
    2024-04-04
  • Expected conditions模块使用方法汇总代码解析

    Expected conditions模块使用方法汇总代码解析

    这篇文章主要介绍了Expected conditions模块使用方法汇总代码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • python使用pycharm环境调用opencv库

    python使用pycharm环境调用opencv库

    这篇文章主要介绍了python使用pycharm环境调用opencv库,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-02-02
  • opencv python在视屏上截图功能的实现

    opencv python在视屏上截图功能的实现

    OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。这篇文章主要介绍了opencv python在视屏上截图,需要的朋友可以参考下
    2020-03-03
  • 关于Python中几种队列Queue用法区别

    关于Python中几种队列Queue用法区别

    这篇文章主要介绍了关于Python中几种队列Queue用法区别,queue队列中的put()或者get()方法中都提供了timeout参数,利用这个参数可以有效解决上述消除不能消费和线程一直阻塞问题,需要的朋友可以参考下
    2023-05-05
  • Python实现HTML文件或字符串转换为纯文本TXT

    Python实现HTML文件或字符串转换为纯文本TXT

    在数据处理、内容提取、网页归档等任务中,经常需要将 HTML 转换为纯文本 TXT,本文将介绍如何用 Python 和 Free Spire.Doc 库完成 HTML 到 TXT 的转换,希望对大家有所帮助
    2025-09-09
  • Python实现简单线性插值去马赛克算法代码示例

    Python实现简单线性插值去马赛克算法代码示例

    去马赛克是图像处理中的一项技术,用于从单色彩滤光片阵列(CFA)图像恢复全彩图像,本文介绍了一种基于简单线性插值的去马赛克算法,并展示了如何将MATLAB代码转换为Python代码,需要的朋友可以参考下
    2024-10-10
  • Django 用户认证组件使用详解

    Django 用户认证组件使用详解

    这篇文章主要介绍了Django 用户认证组件使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • Python使用大语言模型进行图表可视化

    Python使用大语言模型进行图表可视化

    Python使用matplotlib进行可视化一直有2个问题,一是代码繁琐,二是默认模板比较丑,在大模型时代,这个问题有了另一种解法,下面我们就来看看如何使用大语言模型进行图表可视化吧
    2025-04-04

最新评论