可以优先锁定吗?

时间:2016-08-31 15:52:02

标签: python python-3.x multiprocessing python-multiprocessing

我有一个multiprocessing程序

  • 一个进程将元素添加到共享列表(multiprocessing.Manager().list()
  • 其他几个进程使用该列表中的这些元素(并删除它们);它们会一直运行,直到列表中有要处理的内容为止,上面的过程仍在添加到列表中。

我在添加到列表或从中删除时实现了锁定(通过multiprocessing.Lock())。由于有一个"馈线"过程和几个(10-40)"消费者"所有人都争夺锁定,消费者流程很快,我最终选择了#34;馈线"进程很难获得锁定。

是否存在" priority"的概念获得一个锁?我想要"馈线"比其他人更优先获得它的过程。

现在我通过让#34;消费者"来缓解这个问题。进程等待一个随机时间,然后尝试获取锁定,而#34;进给器"进程就在那里(当它结束时设置一个标志)。这是一个可行的解决方法,但它很难实现并且几乎没有效果(我的进程等待random.random()*n秒,其中n是进程数。这是一个完全组成的数字,可能是错误的)。

3 个答案:

答案 0 :(得分:1)

让Feedder获得锁定阻止,以及消费者的非阻塞 所以对于馈线:

try:
    with my_lock.acquire(): #locks block by default
        do stuff
finally:
    my_lock.release()

消费者:

while True:
   try:
      locked = my_lock.acquire(blocking=False)
      if locked:
         do stuff
   finally:
      if locked:
         my_lock.release()
   time.sleep(seconds=10)

答案 1 :(得分:0)

这不完美,但必须有效:

在“馈线”中:

feeder_lock_object.lock()
consumer_lock_object.lock()
try:
    ...
finally:
    feeder_lock_object.release()
    consumer_lock_object.release()

在“消费者”中:

while True:
    with consumer_lock_object:
        if feeder_lock_object.is_locked:
            continue
        ...

但我认为当你使用Queue会更好。

如果使用此方法,请注意如何实现锁定对象。您应该使用初始化函数初始化池,该函数将这些锁定对象创建为全局参数。请参阅this

答案 2 :(得分:0)

尝试更改进程优先级,而不是尝试更改锁定优先级,以使进给者的优先级高于使用者。您使用的解决方法基本上模拟了这一点,但效率较低。

要更改流程优先级,

  

在Unix上:使用os.setpriority()

参考docs

  

在Windows上,使用第三方模块psutil。

请参阅this threadPsutil Docs

相关问题