Python Multiprocessing导入疑问:为何需同时导入模块与成员?
问题原因及解决办法
核心原因
- 只用
import multiprocessing时,代码里直接写Pool会报错,是因为Pool这个名字没被导入到当前代码的命名空间里——得像调用multiprocessing.Event、multiprocessing.cpu_count()那样,写成multiprocessing.Pool才能用。 - 只用
from multiprocessing import Event, Lock, Pool时,multiprocessing这个模块名本身没被引入当前命名空间,所以调用multiprocessing.cpu_count()时,Python找不到multiprocessing这个名字,就会报NameError。
更合理的写法(无需同时用两种导入)
有两种规范的解决方式:
方式一:全程通过模块名调用
保持import multiprocessing,把代码里的Pool改成multiprocessing.Pool即可:
import multiprocessing print('cpu count=', multiprocessing.cpu_count()) event = multiprocessing.Event() # Assign an event object lock = multiprocessing.Lock() with multiprocessing.Pool(processes=2) as pool: for serverNum in range(2): pool.apply_async(funcCall, (event, lock, serverNum))
方式二:按需导入所有用到的成员
把cpu_count也加入导入列表,这样就不用再写模块名:
from multiprocessing import Event, Lock, Pool, cpu_count print('cpu count=', cpu_count()) event = Event() # Assign an event object lock = Lock() with Pool(processes=2) as pool: for serverNum in range(2): pool.apply_async(funcCall, (event, lock, serverNum))
内容的提问来源于stack exchange,提问作者Jay Mosk
相关产品推荐
相关产品推荐

