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)]]

你可能感兴趣的:(python 3.6 多进程的坑)