หากคุณเป็นผู้ใช้ windows และใช้ python 3 โพสต์นี้จะช่วยคุณในการเขียนโปรแกรมแบบขนานใน python เมื่อคุณเรียกใช้การเขียนโปรแกรมพูลของไลบรารีหลายกระบวนการตามปกติคุณจะได้รับข้อผิดพลาดเกี่ยวกับฟังก์ชันหลักในโปรแกรมของคุณ นี่เป็นเพราะความจริงที่ว่า windows ไม่มีฟังก์ชัน fork () โพสต์ด้านล่างกำลังให้วิธีแก้ปัญหาดังกล่าว
http://python.6.x6.nabble.com/Multiprocessing-Pool-woes-td5047050.html
เนื่องจากฉันใช้ python 3 ฉันจึงเปลี่ยนโปรแกรมเป็นแบบนี้:
from types import FunctionType
import marshal
def _applicable(*args, **kwargs):
name = kwargs['__pw_name']
code = marshal.loads(kwargs['__pw_code'])
gbls = globals()
defs = marshal.loads(kwargs['__pw_defs'])
clsr = marshal.loads(kwargs['__pw_clsr'])
fdct = marshal.loads(kwargs['__pw_fdct'])
func = FunctionType(code, gbls, name, defs, clsr)
func.fdct = fdct
del kwargs['__pw_name']
del kwargs['__pw_code']
del kwargs['__pw_defs']
del kwargs['__pw_clsr']
del kwargs['__pw_fdct']
return func(*args, **kwargs)
def make_applicable(f, *args, **kwargs):
if not isinstance(f, FunctionType): raise ValueError('argument must be a function')
kwargs['__pw_name'] = f.__name__
kwargs['__pw_code'] = marshal.dumps(f.__code__)
kwargs['__pw_defs'] = marshal.dumps(f.__defaults__)
kwargs['__pw_clsr'] = marshal.dumps(f.__closure__)
kwargs['__pw_fdct'] = marshal.dumps(f.__dict__)
return _applicable, args, kwargs
def _mappable(x):
x,name,code,defs,clsr,fdct = x
code = marshal.loads(code)
gbls = globals()
defs = marshal.loads(defs)
clsr = marshal.loads(clsr)
fdct = marshal.loads(fdct)
func = FunctionType(code, gbls, name, defs, clsr)
func.fdct = fdct
return func(x)
def make_mappable(f, iterable):
if not isinstance(f, FunctionType): raise ValueError('argument must be a function')
name = f.__name__
code = marshal.dumps(f.__code__)
defs = marshal.dumps(f.__defaults__)
clsr = marshal.dumps(f.__closure__)
fdct = marshal.dumps(f.__dict__)
return _mappable, ((i,name,code,defs,clsr,fdct) for i in iterable)
หลังจากฟังก์ชั่นนี้รหัสปัญหาข้างต้นจะเปลี่ยนไปเล็กน้อยเช่นนี้:
from multiprocessing import Pool
from poolable import make_applicable, make_mappable
def cube(x):
return x**3
if __name__ == "__main__":
pool = Pool(processes=2)
results = [pool.apply_async(*make_applicable(cube,x)) for x in range(1,7)]
print([result.get(timeout=10) for result in results])
และฉันได้ผลลัพธ์เป็น:
[1, 8, 27, 64, 125, 216]
ฉันคิดว่าโพสต์นี้อาจเป็นประโยชน์สำหรับผู้ใช้ windows บางคน