Python 3.x 使python字典像队列一样线程安全
虽然我非常喜欢队列,但在编码时,我遇到了一个问题,如果我使用队列,就无法完成这个问题。基本上,我有一个生产者-工人体系结构,其中许多生产者在生产工作,许多工人在消费和加工工作。排队是一个自然的选择 但是,由于生成的作业数量巨大,我提出了一种解决方案,在作业仍在等待处理时对其进行批处理,并可能从队列中删除一些作业,以便队列中不会有很多项。例如,对于某些作业,时间戳已过期,不再需要处理。我希望在这些工作仍在等待处理时,从队列中剔除这些类型的结果,而不是让工人去弄清楚这一点(在我的情况下,这是很昂贵的,而且我无论如何也不能接触工人) 所以,由于我不能只从队列之间获取项目,所以我决定将结构从队列更改为字典(不能使用列表,因为出于某种原因我需要密钥/值对),并以一种与队列行为完全相同的方式实现dict。这是我的任务清单:Python 3.x 使python字典像队列一样线程安全,python-3.x,Python 3.x,虽然我非常喜欢队列,但在编码时,我遇到了一个问题,如果我使用队列,就无法完成这个问题。基本上,我有一个生产者-工人体系结构,其中许多生产者在生产工作,许多工人在消费和加工工作。排队是一个自然的选择 但是,由于生成的作业数量巨大,我提出了一种解决方案,在作业仍在等待处理时对其进行批处理,并可能从队列中删除一些作业,以便队列中不会有很多项。例如,对于某些作业,时间戳已过期,不再需要处理。我希望在这些工作仍在等待处理时,从队列中剔除这些类型的结果,而不是让工人去弄清楚这一点(在我的情况下,这是很昂贵的
这是我第一次使用条件,因此我将代码放在这里,以便其他人可以验证。谢谢。在这里使用锁可能不是最好的选择。相反,在
pop()
方法中创建一个和.wait()。然后,在put()
中调用.notify()
(在最后,就在您释放之前,但不是在最后,否则您可能会意外地将锁锁定)。很抱歉,我花了一些时间才理解这个概念。我用新代码编辑了我的问题。你能看一下吗?我不明白为什么你把循环条件下放到了if
中,但在我看来它是合理的。我还建议将条件.notify()
调用移动到尝试的末尾,而不是最后的开头。谢谢…既然我理解了这个概念,我可以做出适当的更改…)
def put(self, userId, job):
self.__lock.acquire()
try:
if userId in self.__queue:
#merge the 'job' and the dict already present in 'self.__queue[userId]'
else:
self.__queue[userId] = job
finally:
self.__lock.release()
def pop(self, wait = True):
self.__lock.acquire()
try:
if wait:
while(len(self.__queue) == 0):
pass
#pop the 'first' value in dict.
#Please do not worry that dict has no first or last value.
#I sort the dict keys, and pop the first value.
finally:
self.__lock.release()
def put(self, userId, job):
self.__condition.acquire()
try:
if userId in self.__queue:
#merge the 'job' and the dict already present in 'self.__queue[userId]'
else:
self.__queue[userId] = job
finally:
self.__condition.notify()
self.__condition.release()
def pop(self, wait = True):
self.__condition.acquire()
try:
if wait:
while True:
if(len(self.__queue) > 0):
break
self.__condition.wait()
#pop the 'first' value in dict.
#Please do not worry that dict has no first or last value.
#I sort the dict keys, and pop the first value.
finally:
self.__condition.release()