Python多进程中多参数问题

要注意的一点是:传递给进程的参数必须是可序列化的,常见的数据类型都是可序列化的,自定义的类一般是不可序列化的,(在java中有将自定类写为可序列化的方式,不知道python中有没有,懒得查了)如果需要在进程中使用自定义类的对象,而不想多次初始化,可以将自定义类对象设为全局变量。(下面方式一的 [解决办法] 链接中我曾这样试过是可以的)

方式一:每个进程使用不同的参数 x 和相同的参数 y

def work(x, y):
    return x + y
    
from functools import partial
import multiprocessing as mp
pool = mp.Pool(3)
x = [1,2,3,4,5]
partial_work = partial(work, y=1)    # 提取x作为partial函数的输入变量
results = pool.map(partial_work, x)

这种情况也可以把 y 设置为全局变量,参见我的另一篇文章中的 解决方法

方式二:每个进程使用不同的参数x、y

def work(x_y):
    x = x_y[0]
    y = x_y[1]
    return x + y
    
import multiprocessing as mp
pool = mp.Pool(3)
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)

方式三:每个进程使用不同的参数 x、y

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

from pathos.multiprocessing import ProcessingPoll as Pool
pool = Pool(4)
x = [1,2,3,4,5,6]
y = [1,3,1,2,1,1]
results = pool.map(work, x, y)

bug

RuntimeError: 
        An attempt has been made to start a new process before the
        current process has finished its bootstrapping phase.

        This probably means that you are not using fork to start your
        child processes and you have forgotten to use the proper idiom
        in the main module:

            if __name__ == '__main__':
                freeze_support()
                ...

        The "freeze_support()" line can be omitted if the program
        is not going to be frozen to produce an executable.
    _check_not_importing_main()

解决方法:
在main函数中调用多进程 if __name__=="__main__":

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
启动多线程在Python多进程中可以提高程序的并发性和效率。Python的多线程可以在多个CPU核心上同时执行,从而使得程序可以更快地完成任务。在Python中,使用`threading`模块可以创建和管理多个线程。以下是在Python多进程中启动多线程的步骤: 1. 导入`threading`模块:首先需要导入`threading`模块,以便使用其中提供的多线程功能。 2. 创建线程对象:使用`threading.Thread()`类来创建线程对象。在创建线程对象时,需要指定线程要执行的函数或方法,并可以传递参数给该函数或方法。 3. 启动线程:通过调用线程对象的`start()`方法来启动线程。启动线程后,线程对象自动调用其对应函数或方法。 4. 等待线程结束:如果需要等待所有线程执行完毕,可以使用`join()`方法。调用线程对象的`join()`方法阻塞主线程,直到该线程执行完毕。 需要注意的是,Python的多线程由于全局解释器锁(GIL)的存在,并不能实现真正的并行执行。因此,在处理计算密集型的任务时,多线程的效果可能不如多进程。但在面对I/O密集型任务时,多线程可以充分利用等待I/O操作的时间,提高程序的效率。 引用中提到了关于Python多线程的GIL锁问题,该问题限制了Python线程的并行性能。因此,在使用多线程时,需要根据具体的任务类型和需求来选择合适的并发模型。在处理I/O密集型任务时,多线程仍然是一个有效的选择,可以充分利用系统资源,提高程序的运行速度。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Python 多线程+多进程简单使用教程,如何在多进程开多线程](https://download.csdn.net/download/weixin_38733367/13740222)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [python爬虫之多线程、多进程爬虫](https://download.csdn.net/download/weixin_38671048/15443909)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Python变量在函数中的作用域.md](https://download.csdn.net/download/qq_42431718/88241192)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值