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

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python 3.6中的多进程queue是一个在多个进程之间共享数据的队列。它基于进程间通信(IPC)机制来实现数据的安全传递和同步。 使用多进程queue的关键是先创建一个Queue对象,然后将其传递给不同的进程,使得多个进程可以读取和写入相同的队列。以下是使用python多进程queue的基本步骤: 1. 首先导入必要的库: ```python from multiprocessing import Process, Queue ``` 2. 创建Queue对象: ```python queue = Queue() ``` 3. 定义需要在多进程中执行的函数,该函数可以将数据写入队列: ```python def write_to_queue(queue, data): queue.put(data) ``` 4. 创建进程并启动: ```python p = Process(target=write_to_queue, args=(queue, "Hello world!")) p.start() ``` 5. 在主进程中从队列中读取数据: ```python data = queue.get() print(data) # 输出: Hello world! ``` 以上示例中,我们创建了一个进程p,该进程执行write_to_queue函数并将数据"Hello world!"写入队列。然后从主进程中使用queue.get()方法获取队列中的数据,并将其打印出来。 需要注意的是,多进程queue中的数据是由操作系统来管理和同步的,因此确保数据传递的顺序和可靠性。此外,为了终止子进程,我们还可以使用p.join()方法。 总结:Python 3.6中的多进程queue提供了一种在多个进程之间共享数据的有效和方便的方式,通过使用Queue对象,我们可以实现数据的安全传递和同步。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值