Python 多进程 multiprocessing 执行的一个代码模板(1)

之前不会用,用了发现,可以大大提高生产力,提高哥的幸福指数,遇到那种阻塞的进程,好用的亿批

建议先看下廖雪峰的多进程讲解:
https://www.liaoxuefeng.com/wiki/1016959663602400/1017628290184064

以下给一个模板,诸位替换函数就可使用

1. 模板1

from multiprocessing import Pool
from functools import partial

params_list = [
	# 此处需要修改
	item1,
	item2,
	item3,
	...
]

if __name__ == "__main__":

	with Pool(processes=8) as pool: # 开启8个进程进行运行, 这个自己设置吧,一般CPU核数就行,遇到存在阻塞的情况,比CPU核心稍多一些就好
	
	    parallel_warp = partial(parallel_fun, 一些已经定下来的参数)
	    pool.map(parallel_warp, params_list)
	                
	    # 单步调试进入这里, 多进程看上边儿
	    # parallel_warp(params_list[0])

用上下文管理器 Pool(processes=8) 好用的一批
给个例子:

from multiprocessing import Pool
from functools import partial

params_list = [
	# 此处需要修改
	1, 2, 3, 4, 5
]


def print_ABC_num(num, A, B, C):
    print(A, B, C, num)

parallel_fun = print_ABC_num

if __name__ == "__main__":

    with Pool(processes=8) as pool: # 开启8个进程进行运行

        parallel_warp = partial(parallel_fun, A="a", B="bb", C="CcC")
        pool.map(parallel_warp, params_list)
                    
        # 单步调试进入这里, 多进程看上边儿
        # parallel_warp(params_list[0])

值得一提的是,还可以通过这样的操作来获取每个并行函数的结果:

for result in pool.map(worker, [1,2,3]):
	print(result)

2. 模板2

有时候,并行函数的输入的变化参数不止一个怎么搞,除了修改 params_list 曲线救国,还可以这样:

from multiprocessing import Pool
from functools import partial

params_list1 = [
	# 此处需要修改
	item1, 
	item2, 
	item3,
	...... 
]
params_list2 = [
	# 此处需要修改
	item1, 
	item2, 
	item3,
	...... 
]

if __name__=='__main__':
    
    p = Pool(8)

    for a, b in zip(params_list1, params_list2):
        p.apply_async(parallel_fun, args=(a, b))
    
    p.close()
    p.join()

同样,给个例子:

from multiprocessing import Pool
from functools import partial



def print_A_and_B(A, B):
    print("{}\t{}\t{}".format(A, B, A+B))


if __name__=='__main__':
    
    params_list1 = [
        # 此处需要修改
        1, 2, 3, 4, 5
    ]
    params_list2 = [
        # 此处需要修改
        6, 7, 8, 9, 10
    ]
    
    p = Pool(8)

    for a, b in zip(params_list1, params_list2):
        p.apply_async(print_A_and_B, args=(a, b))
    
    p.close()
    p.join()

3. 模板2的几点说明

关于上面的p.close()p.join():

对Pool对象调用join()方法会等待所有子进程执行完毕,调用join()之前必须先调用close(),调用close()之后就不能继续添加新的Process了
(摘自廖雪峰的博客)

4. if name==‘main

这句常用的if,起到了至关重要的作用,如果没有这句话,会报错:

发生异常: RuntimeError       (note: full exception trace is shown but execution is paused at: <module>)

        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.
  File "xxxxx/try.py", line 21, in <module>
    p = Pool(8)
  File "xxxxx", line 1, in <module> (Current frame)

参考了:
在这里插入图片描述
https://stackoverflow.com/questions/18204782/runtimeerror-on-windows-trying-python-multiprocessing

windows 系统中,子进程将首先先导入 main 模块(也就是当前文件)
我们需要使用 if __name__=='__main__' 来避免被子进程递归创建子进程

5. 查看电脑核数

在这里插入图片描述
摘自:
https://www.cnblogs.com/emanlee/p/3587571.html

# 总核数 = 物理CPU个数 X 每颗物理CPU的核数 
# 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数

# 查看物理CPU个数
cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l

# 查看每个物理CPU中core的个数(即核数)
cat /proc/cpuinfo| grep "cpu cores"| uniq

# 查看逻辑CPU的个数
cat /proc/cpuinfo| grep "processor"| wc -l
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 下面是一个使用python `multiprocessing` 模块实现多进程的示例代码: ``` import multiprocessing def worker(number): print(f'Worker {number} is running') if __name__ == '__main__': for i in range(5): p = multiprocessing.Process(target=worker, args=(i,)) p.start() ``` 这段代码创建了5个进程,每个进程都执行`worker`函数,并打印出进程编号。 ### 回答2: 下面是一个使用Python multiprocessing模块实现多进程的示例代码: ```python import multiprocessing def worker(name): print(f'Worker {name} 执行') if __name__ == '__main__': processes = [] for i in range(5): p = multiprocessing.Process(target=worker, args=(i,)) processes.append(p) p.start() for p in processes: p.join() ``` 以上代码创建了5个进程,并通过worker函数在每个进程中执行一些任务。在主程序的主函数中,先创建一个进程列表用于存储即将被创建的进程对象。 在for循环中,通过multiprocessing.Process类创建一个进程对象,将要执行的任务指定为worker函数,并传递一个参数i给worker函数。然后将新创建的进程对象添加到进程列表中。 接着,使用p.start()启动每个进程。 最后,使用p.join()等待每个进程执行完毕,确保所有进程都执行完毕后再继续主程序的执行。 运行以上代码,你会看到五个进程同时被创建并执行,不同进程之间的输出顺序可能会有不同。 ### 回答3: 多进程可以通过Pythonmultiprocessing模块来实现。下面是一个使用Python multiprocessing模块实现多进程的示例代码: ```python import multiprocessing def worker(num): """Worker function""" print(f'Worker {num} started') # do some work print(f'Worker {num} finished') if __name__ == '__main__': # 创建多个进程 processes = [] for i in range(5): p = multiprocessing.Process(target=worker, args=(i,)) processes.append(p) p.start() # 等待进程结束 for process in processes: process.join() ``` 在上述代码中,我们首先定义了worker函数作为每个进程要执行的任务。然后,在主程序中使用for循环创建了5个进程,并将它们存储在一个列表中。每个进程都使用multiprocessing.Process类创建,并指定了要执行的目标函数和传递给它的参数。然后,我们通过调用start()方法来启动每个进程。 在所有进程都启动后,我们通过调用join()方法来等待每个进程的结束。这样可以确保主程序在所有子进程执行完毕之前不会退出。 运行上面的代码,你会看到每个进程都会输出"Worker x started"和"Worker x finished"的信息,其中x是进程的编号。 使用Pythonmultiprocessing模块可以帮助我们实现多进程编程,从而在计算机上同时执行多个任务,提高程序的运行效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值