我可能遗漏了一些非常简单的东西。
为什么我不能使用pool.map(sys.stdout.write, iterable)
?
我可以使用pool.map(len, iterable)
使用相同的可迭代对象,但是当使用sys.stdout.write
时,我会收到以下异常:
TypeError: expected string or Unicode object, NoneType found
这是跟踪信息:
Traceback (most recent call last):
File "/home/reut/python/print_mult.py", line 19, in <module>
pool.map(sys.stdout.write, messages)
File "/usr/lib/python2.7/multiprocessing/pool.py", line 251, in map
return self.map_async(func, iterable, chunksize).get()
File "/usr/lib/python2.7/multiprocessing/pool.py", line 558, in get
raise self._value
TypeError: expected string or Unicode object, NoneType found
完整代码:
#!/usr/bin/env python
import multiprocessing
import sys
# pool of 10 workers
pool = multiprocessing.Pool(10)
messages = ["message #%d\n" % i for i in range(100)]
print messages
pool.map(sys.stdout.write, messages) # doesn't work - error
# print pool.map(len, messages) # works
编辑 #1 - 线程池可行:
当我使用来自multiprocessing.pool
的ThreadPool
时,它是可行的,因此我认为它与无法在进程间共享sys.stdout
流有关。
编辑 #2 - 手动进程也可行:
from multiprocessing import Process
import sys
# pool of 10 workers
processes = []
for i in range(10):
processes.append(Process(target=sys.stdout.write, args=("I am process %d" % i, )))
for p in processes:
p.start()
for p in processes:
p.join()
现在我感到困惑的原因是,我知道常规进程和map进程之间的区别在于它分叉的点。但我不确定它在这里的相关性。唯一能想到的是,map会在内部存储target
并且无法像Process
的手动构造函数一样与工作进程共享。