相关疑难解决方法(0)

使用多处理Pool.map()时无法pickle <type'instancemethod'>

我想使用multiprocessingPool.map()功能,同时划分出工作.当我使用以下代码时,它工作正常:

import multiprocessing

def f(x):
    return x*x

def go():
    pool = multiprocessing.Pool(processes=4)        
    print pool.map(f, range(10))


if __name__== '__main__' :
    go()
Run Code Online (Sandbox Code Playgroud)

但是,当我在面向对象的方法中使用它时,它不起作用.它给出的错误信息是:

PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup
__builtin__.instancemethod failed
Run Code Online (Sandbox Code Playgroud)

当以下是我的主程序时会发生这种情况:

import someClass

if __name__== '__main__' :
    sc = someClass.someClass()
    sc.go()
Run Code Online (Sandbox Code Playgroud)

以下是我的someClass课程:

import multiprocessing

class someClass(object):
    def __init__(self):
        pass

    def f(self, x):
        return x*x

    def go(self):
        pool = multiprocessing.Pool(processes=4)       
        print pool.map(self.f, range(10))
Run Code Online (Sandbox Code Playgroud)

任何人都知道问题可能是什么,或者一个简单的方法呢?

python multithreading pool pickle multiprocessing

206
推荐指数
6
解决办法
12万
查看次数

在多处理池中保持 boto3 会话处于活动状态

我正在尝试删除 s3 中的很多文件。我计划使用 amultiprocessing.Pool来执行所有这些删除操作,但我不确定如何s3.client在作业之间保持活动状态。我想做类似的事情

import boto3
import multiprocessing as mp

def work(key):
    s3_client = boto3.client('s3')
    s3_client.delete_object(Bucket='bucket', Key=key)

with mp.Pool() as pool:
    pool.map(work, lazy_iterator_of_billion_keys)
Run Code Online (Sandbox Code Playgroud)

s3_client = boto3.client('s3')但这样做的问题是,在每项工作开始时都要花费大量时间。文档说要为每个进程创建一个新的资源实例,因此我需要一种方法为每个进程创建一个 s3 客户端。

有没有办法为池中的每个进程创建一个持久的 s3 客户端或缓存客户端?

另外,我计划通过发送批量密钥并使用 来优化删除s3_client.delete_objects,但s3_client.delete_object为了简单起见,在我的示例中进行了展示。

python multiprocessing boto3

5
推荐指数
1
解决办法
4597
查看次数

标签 统计

multiprocessing ×2

python ×2

boto3 ×1

multithreading ×1

pickle ×1

pool ×1