python多进程反而慢_python 3.6 多进程的坑

python 慢是事实, 但是你如果想让他快,使用cpython 也可以,但是前提在你不使用第三方包的情况下,你要用了numpy pandas ,cython 就无法使用了,那只有 使用python的多线程 多进程 协程来解决

都知道 python 有 GIL全局锁,所以 多线程是鸡肋,只有 多进程才可以利用上多核cpu ,当你启动你的程序 打开 htop 看到多个核都 跑满了 飚绿色 100% 了 就是成功用上了python的多进程 ,线程是进程的子集,协程是介于 线程和进程的

在使用python的多进程有很多 坑,使用多进程 如果不用异步 就是阻塞 了,如果 代码写的不同,就又阻塞了。

创建 进程池 Pool,然后使用 apply_sync()方法实现异步

注意了 apply_sync()里的参数书写非常有讲究,不然就错了,就滑出去了,不执行,要么就是阻塞执行,

apply_sync(func= ,args=(,)), func 就是你要调用的方法,args就是放你调用方法的参数列表,实参, [func=]这五个字符不可以省略,生了,就不执行了,【args=】这五个字符也不可以省略,而且 args= 后跟的 小括号里 末尾必须跟一个 逗号【,】否则还是阻塞执行,

如果你 被调用的方法有返回值 ,必须使用 for 推导迭代式获取 每个方法的 result.get(),不然就又变阻塞了,阻塞的一个表现就是只能使用跑满一个cpu 核 核量,其他核就一直闲置,

import multiprocessing

from multiprocessing import Pool,cpu_count

from multiprocessing import Queue

from multiprocessing import Lock

from multiprocessing import Pipe

import logging

import numpy as np

import pandas as pd

multiprocessing.freeze_support()

pool=Pool(processes=self.cpus)

sub_dir_list=[]

logger.info("parrel_iter_image")

for sub_dir in range(0,10):

sub_root = self.image_root_dir + str(sub_dir) + '/'

sub_dir_list.append(sub_root)

logger.info(len(sub_dir_list))

result=[res.get() for res in [ pool.apply_async(func=self.iter_image,args=(sub_dir,)) for sub_dir in sub_dir_list]]

self.real_face= result

results = [res.get() for res in

[propool.apply_async(func=self._sub_df_etl, args=(df, field, out_field, use_stopword,)) for

index, df in enumerate(df_list)]]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值