Python 使用多处理构建字典
Python building a dictionary with multiprocessing
我是多处理模块的新手。在我的代码中,我试图用来自给定路径的图像构建一个字典。我写了下面的代码:
from multiprocessing import Pool
from PIL import Image, ImageTk
import glob
def process(path):
print path
im=ImageTk.PhotoImage(Image.open(path).resize((600, 600), Image.ANTIALIAS))
name = (path.split('/')[1]).split('.')[0]
return (name, im)
p = Pool(4)
input = glob.glob('./*.jpg')
image_list = dict(p.map(process, input))
如果代码工作正常,我希望得到如下结果:
{'-22': PIL.ImageTk.PhotoImage object at 0x7f6b66507150,
'-23': PIL.ImageTk.PhotoImage object at 0x7f6b66507190, ...
and so on}
... 但我收到以下错误:
`multiprocessing.pool.MaybeEncodingError: Error sending result:`
`'[('-51', PIL.ImageTk.PhotoImage object at 0x7f6b664f6990),`
`('-47', PIL.ImageTk.PhotoImage object at 0x7f6b664f6fd0),`
`('-54', PIL.ImageTk.PhotoImage object at 0x7f6b66507050),`
`('-13', PIL.ImageTk.PhotoImage object at 0x7f6b665070d0),`
`('-45', PIL.ImageTk.PhotoImage object at 0x7f6b66507110),`
`('-49', PIL.ImageTk.PhotoImage object at 0x7f6b66507150),`
`('-48', PIL.ImageTk.PhotoImage object at 0x7f6b66507190),`
`('-26', PIL.ImageTk.PhotoImage object at 0x7f6b665071d0),`
`('-10', PIL.ImageTk.PhotoImage object at 0x7f6b66507210)]'.`
`Reason: 'UnpickleableError(tkapp object at 0x7f6b67c88e30,)'`
我该如何解决这个问题?
多处理不是线程。它是一个完全独立的进程,有自己的解释器。这有一些优点——你不会不小心创建共享可变状态,这太棒了!它有一些缺点 - 这是其中之一。
所有传入或传出多处理进程的数据结构都必须是 serialized/deserialized。因此,该函数的 return 值必须在幕后进行 pickle - 如您所见,它不能。
对于您当前的设计,请使用线程而不是多处理。
我是多处理模块的新手。在我的代码中,我试图用来自给定路径的图像构建一个字典。我写了下面的代码:
from multiprocessing import Pool
from PIL import Image, ImageTk
import glob
def process(path):
print path
im=ImageTk.PhotoImage(Image.open(path).resize((600, 600), Image.ANTIALIAS))
name = (path.split('/')[1]).split('.')[0]
return (name, im)
p = Pool(4)
input = glob.glob('./*.jpg')
image_list = dict(p.map(process, input))
如果代码工作正常,我希望得到如下结果:
{'-22': PIL.ImageTk.PhotoImage object at 0x7f6b66507150,
'-23': PIL.ImageTk.PhotoImage object at 0x7f6b66507190, ... and so on}
... 但我收到以下错误:
`multiprocessing.pool.MaybeEncodingError: Error sending result:`
`'[('-51', PIL.ImageTk.PhotoImage object at 0x7f6b664f6990),`
`('-47', PIL.ImageTk.PhotoImage object at 0x7f6b664f6fd0),`
`('-54', PIL.ImageTk.PhotoImage object at 0x7f6b66507050),`
`('-13', PIL.ImageTk.PhotoImage object at 0x7f6b665070d0),`
`('-45', PIL.ImageTk.PhotoImage object at 0x7f6b66507110),`
`('-49', PIL.ImageTk.PhotoImage object at 0x7f6b66507150),`
`('-48', PIL.ImageTk.PhotoImage object at 0x7f6b66507190),`
`('-26', PIL.ImageTk.PhotoImage object at 0x7f6b665071d0),`
`('-10', PIL.ImageTk.PhotoImage object at 0x7f6b66507210)]'.`
`Reason: 'UnpickleableError(tkapp object at 0x7f6b67c88e30,)'`
我该如何解决这个问题?
多处理不是线程。它是一个完全独立的进程,有自己的解释器。这有一些优点——你不会不小心创建共享可变状态,这太棒了!它有一些缺点 - 这是其中之一。
所有传入或传出多处理进程的数据结构都必须是 serialized/deserialized。因此,该函数的 return 值必须在幕后进行 pickle - 如您所见,它不能。
对于您当前的设计,请使用线程而不是多处理。