我有一个multiprocessing
程序
multiprocessing.Manager().list()
)我在添加到列表或从中删除时实现了锁定(通过multiprocessing.Lock()
)。由于有一个"馈线"过程和几个(10-40)"消费者"所有人都争夺锁定,消费者流程很快,我最终选择了#34;馈线"进程很难获得锁定。
是否存在" priority"的概念获得一个锁?我想要"馈线"比其他人更优先获得它的过程。
现在我通过让#34;消费者"来缓解这个问题。进程等待一个随机时间,然后尝试获取锁定,而#34;进给器"进程就在那里(当它结束时设置一个标志)。这是一个可行的解决方法,但它很难实现并且几乎没有效果(我的进程等待random.random()*n
秒,其中n
是进程数。这是一个完全组成的数字,可能是错误的)。
答案 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。