是我的多处理设置。我将Process方法子类化并给出了它 用于酸洗/数据目的的队列和一些其他字段。
这种策略大约有95%的时间可以使用,另外5%因为一个未知的原因,队列只是挂起而且它永远不会完成(4个核心中有3个完成了他们的工作,而最后一个核心永远需要,所以我很常见只是杀了这份工作。)
我知道队列在python中有一个固定的大小,否则它们会挂起。我的队列只存储一个字符串...处理器的id,所以不能那样。
以下是我的代码停止的确切行:
res = self._recv()
有没有人有想法?正式代码如下。 谢谢。
from multiprocessing import Process, Queue
from multiprocessing import cpu_count as num_cores
import codecs, cPickle
class Processor(Process):
def __init__(self, queue, elements, process_num):
super(Processor, self).__init__()
self.queue = queue
self.elements = elements
self.id = process_num
def job(self):
ddd = []
for l in self.elements:
obj = ... heavy computation ...
dd = {}
dd['data'] = obj.data
dd['meta'] = obj.meta
ddd.append(dd)
cPickle.dump(ddd, codecs.open(
urljoin(TOPDIR, self.id+'.txt'), 'w'))
return self.id
def run(self):
self.queue.put(self.job())
if __name__=='__main__':
processes = []
for i in range(0, num_cores()):
q = Queue()
p = Processor(q, divided_work(), process_num=str(i))
processes.append((p, q))
p.start()
for val in processes:
val[0].join()
key = val[1].get()
storage = urljoin(TOPDIR, key+'.txt')
ddd = cPickle.load(codecs.open(storage , 'r'))
.. unpack ddd process data ...
答案 0 :(得分:1)
在time.sleep(0.001)
方法的开头执行run()
。
答案 1 :(得分:0)
根据我的经验
time.sleep(0.001)
到目前为止还不够长。
我有类似的问题。如果您在队列上调用get()
或put()
并且#34;太早"似乎会发生这种情况。我想它不知何故无法快速初始化。不完全确定,但我推测它可能与队列可能使用底层操作系统传递消息的方式有关。在我开始使用BeautifulSoup和lxml后,它开始发生在我身上,它影响了完全不相关的代码。
我的解决方案有点大丑,但它很简单且有效:
import time
def run(self):
error = True
while error:
self.queue.put(self.job())
error = False
except EOFError:
print "EOFError. retrying..."
time.sleep(1)
在我的机器上,它通常在应用程序启动期间重试两次,之后再也不会重试。你需要在发送者和接收者内部这样做,因为双方都会发生这种错误。