python的multiprocessing的坑

1参数就算只有一个也要写成(arg,)的形式

2在类里面必须声明成静态方法

3不能将要执行子进程的方法写到于Pool或者Process同级的方法内部

4执行子进程的方法如果是使用map进程池的时候必须只能接受一个参数,所以多参数的时候要使用zip包裹起来,使用apply参数必须分开,不能只写为一个

5有的对象不可以被pickle则不能当作参数传递

6多进程中可以传递lock,但不能直接传递queue对象,只能使用manager的list等对像,或者必须在实例化queue对象的时候初始化queue才行,举例:

import multiprocessing as MP

def f(msg):

    f.q.put(msg)

    def q_init(q):

    f.q = q

if __name__ == "__main__":

q = MP.Queue()

p = MP.Pool(None, q_init, (q,))

for i in range(0,8):

p.apply_async(f, (i,))

    p.close()

     p.join()

     while not q.empty():

     print(q.get())

。。。。未完待续

 

7 python2的multiprocessing不可以把方法写到类里面,必须写出来才能执行

8 不能在多个子进程中写同一个h5py文件然后再join()之后再关闭文件,这样会导致写入的数据再关闭时被瞬间清空,不知道原因,只可以再单个子进程中写了数据就关闭才行 。

9 须在close()方法前加上result.get()方法才能捕捉子进程的错误,否则有可能子进程出错了就直接跳过了而不报错。该方法对map和apply都实用,已经测试过了

 

10 The multiprocessing module has a major limitation: it only accepts certain functions, and in certain situations. For instance any class methods, lambdas, or functions defined in __main__ wont’ work. This is due to the way Python “pickles” (read: serializes) data and sends it to the worker processes. “Pickling” simply can’t handle a lot of different types of Python objects.

Fortunately, there is a fork of the multiprocessing module called multiprocess that works just fine (pip install --user multiprocess). multiprocess uses dillinstead of pickle to serialize Python objects (read: send your data and functions to the Python workers), and does not suffer the same issues. Usage is identical:

# shut down the old workers
pool.close()

from multiprocess import Pool
pool = Pool(8)
%timeit pool.map(lambda x: time.sleep(0.1), range(24))
pool.close()

11. multiprocessing的list,dict等等出来的对象如果要pickle或者其他方式保存需要先转成普通的dict和list(使用强制转换(list(),dict())方式即可),不然保存不了数据,而且pickle还不报错,只会产生一个空文件,pickle打开该文件将会报找不到文件的错,虽然该空文件已经存在了。

 

 

 

你可能感兴趣的:(python的multiprocessing的坑)