เมื่อฉันเรียกใช้บางสิ่งเช่น:
from multiprocessing import Pool
p = Pool(5)
def f(x):
return x*x
p.map(f, [1,2,3])
มันใช้งานได้ดี อย่างไรก็ตามการวางสิ่งนี้เป็นฟังก์ชันของคลาส:
class calculate(object):
def run(self):
def f(x):
return x*x
p = Pool()
return p.map(f, [1,2,3])
cl = calculate()
print cl.run()
ทำให้ฉันมีข้อผิดพลาดต่อไปนี้:
Exception in thread Thread-1:
Traceback (most recent call last):
File "/sw/lib/python2.6/threading.py", line 532, in __bootstrap_inner
self.run()
File "/sw/lib/python2.6/threading.py", line 484, in run
self.__target(*self.__args, **self.__kwargs)
File "/sw/lib/python2.6/multiprocessing/pool.py", line 225, in _handle_tasks
put(task)
PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed
ฉันเห็นโพสต์จาก Alex Martelli จัดการกับปัญหาแบบเดียวกัน แต่ก็ไม่ชัดเจนพอ
IPython.Parallel
แต่คุณสามารถแก้ไขปัญหาได้โดยการผลักวัตถุไปยังโหนด ดูเหมือนว่าค่อนข้างน่ารำคาญที่จะแก้ไขปัญหาด้วยการประมวลผลหลายตัว
calculate
คือ picklable จึงดูเหมือนว่าเช่นนี้สามารถแก้ไขได้โดย 1) การสร้างวัตถุฟังก์ชั่นคอนสตรัคที่สำเนากว่าcalculate
ตัวอย่างแล้ว 2) ผ่านอินสแตนซ์ของวัตถุฟังก์ชันนี้เพื่อPool
's map
วิธี ไม่มี?
multiprocessing
โมดูลเกิดจากเป้าหมายของการใช้งานข้ามแพลตฟอร์มและการขาดการfork(2)
เรียกระบบที่เหมือนกันใน Windows หากคุณไม่สนใจเกี่ยวกับการสนับสนุน Win32 อาจมีวิธีการแก้ไขตามกระบวนการที่ง่ายขึ้น หรือหากคุณกำลังเตรียมที่จะใช้หัวข้อแทนของกระบวนการคุณสามารถใช้แทนด้วยfrom multiprocessing import Pool
from multiprocessing.pool import ThreadPool as Pool