[英]Python Multiprocessing Processes seem to share objects also the should
在我的多处理代码中,有几个用于并行处理的工作程序。
工作人员只能通过request_queue和带锁的共享值进行通信。
但是现在看来,由于启动时的“分叉”,例如,工人#4和#5共享同一词典文档。 我发现使用id(document)查看内存地址。
由于将文档存储在mongodb中,其驱动程序将_id写回到文档中,因此会出现奇怪的错误。
必须确保每个工作人员都完全隔离了队列和共享值,而我现在不知道如何。
工人从开始:
for i in range(workers):
Worker( request_queue,i,val, lock ).start()
class Worker(Process):
def __init__(self, queue,ident,val,lock):
super(Worker, self).__init__()
self.queue= queue
self.idstr= str(ident)
self.val = val
self.lock = lock
dbconn = dbconnector.DBConnector()
self.mongoconnection = dbconn.getMongoConnection()
self.flagController = FlagController()
print "Ident" + self.idstr
def run(self):
print 'Worker started'
# do some initialization here
print 'Worker Loop!'
#time.sleep(5)
try:
for data in iter( self.queue.get, None ):
mid = data["_id"]
print "#" + self.idstr + " : Mongoid " + str(mid)
#time.sleep(5)
try:
timestamp = time.time()
document = {"rawdata": data,
"c": {
"quelle": "t",
"timestamp": mid.generation_time,
"query" : data["query"]
}
}
self.mongoconnection.insert("productive","input",document)
我知道更新试图通过构造函数传递一个新文档,并通过self.document在Worker中使用它,但是遗憾的是没有帮助。
确保隔离每个工作线程的一种方法是为每个线程分配自己的实例变量。 即用self.document引用文档。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.