python 中多进程优先级队列的队列函数与 SyncManager class
queue function for Multiprocess Priority Queue in python with SyncManager class
我想实现多处理优先级队列。
我找到了这个答案:- Strange Queue.PriorityQueue behaviour with multiprocessing in Python 2.7.6
来自 Dano
在我实现这个之后。我可以为我的优先队列使用 .get() 和 .put() 函数,但是当我使用 .queue 打印队列中的当前元素时,它给了我一个错误
代码:-
class MyManager(SyncManager):
pass
def get_manager():
MyManager.register("PriorityQueue", PriorityQueue) # Register a shared PriorityQueue
m = MyManager()
m.start()
return m
m = get_manager()
call= m.PriorityQueue()
for i in range(5):
call.put(i)
print(call.queue)
错误:AttributeError: 'AutoProxy[PriorityQueue]' object has no attribute 'queue'
我阅读了 SyncManager 的 python 文档并修改了我的代码。
新密码:-
class MyManager(SyncManager):
pass
def get_manager():
MyManager.register("PriorityQueue", PriorityQueue,exposed=['put','get','queue']) # Register a shared PriorityQueue
m = MyManager()
m.start()
return m
m = get_manager()
call= m.PriorityQueue()
for i in range(5):
call.put(i)
print(call.queue)
现在输出是:-
<bound method AutoProxy[PriorityQueue].queue of <AutoProxy[PriorityQueue] object, typeid 'PriorityQueue' at 0x7ff3b48f2dd0>>
我仍然没有得到队列中的元素,我阅读了有关寄存器函数的 method_to_typeid
属性来映射 exposed
中提到的 return 类型的函数,但我不知道不知道如何使用它。
谁能帮我解决这个问题,这样我就可以打印队列中的元素而不用将它们从队列中弹出
您只能通过代理使用引用对象的方法。由于PriorityQueue().queue
不是一个方法,而是一个实例属性,所以你需要提供一个方法来return这个属性的值。
下面的示例选择了具有子类化 PriorityQueue
.
的通用 get_attribute
方法
# Python 3.7.1
from queue import PriorityQueue
from multiprocessing.managers import SyncManager
from multiprocessing import Process
SENTINEL = None
class MyPriorityQueue(PriorityQueue):
def get_attribute(self, name):
return getattr(self, name)
class MyManager(SyncManager):
pass
def get_manager():
MyManager.register("PriorityQueue", MyPriorityQueue)
m = MyManager()
m.start()
return m
def f(q):
for item in iter(lambda: q.get()[1], SENTINEL):
print(item)
print(f'queue: {q.get_attribute("queue")}')
if __name__ == '__main__':
m = get_manager()
pq = m.PriorityQueue()
tasks = enumerate([f'item_{i}' for i in range(5)] + [SENTINEL])
for task in tasks:
pq.put(task)
print(f'queue: {pq.get_attribute("queue")}')
print(f'maxsize: {pq.get_attribute("maxsize")}')
p = Process(target=f, args=(pq,))
p.start()
p.join()
示例输出:
queue: [(0, 'item_0'), (1, 'item_1'), (2, 'item_2'), (3, 'item_3'), (4, 'item_4'), (5, None)]
maxsize: 0
item_0
item_1
item_2
item_3
item_4
queue: []
我想实现多处理优先级队列。 我找到了这个答案:- Strange Queue.PriorityQueue behaviour with multiprocessing in Python 2.7.6
来自 Dano
在我实现这个之后。我可以为我的优先队列使用 .get() 和 .put() 函数,但是当我使用 .queue 打印队列中的当前元素时,它给了我一个错误
代码:-
class MyManager(SyncManager):
pass
def get_manager():
MyManager.register("PriorityQueue", PriorityQueue) # Register a shared PriorityQueue
m = MyManager()
m.start()
return m
m = get_manager()
call= m.PriorityQueue()
for i in range(5):
call.put(i)
print(call.queue)
错误:AttributeError: 'AutoProxy[PriorityQueue]' object has no attribute 'queue'
我阅读了 SyncManager 的 python 文档并修改了我的代码。
新密码:-
class MyManager(SyncManager):
pass
def get_manager():
MyManager.register("PriorityQueue", PriorityQueue,exposed=['put','get','queue']) # Register a shared PriorityQueue
m = MyManager()
m.start()
return m
m = get_manager()
call= m.PriorityQueue()
for i in range(5):
call.put(i)
print(call.queue)
现在输出是:-
<bound method AutoProxy[PriorityQueue].queue of <AutoProxy[PriorityQueue] object, typeid 'PriorityQueue' at 0x7ff3b48f2dd0>>
我仍然没有得到队列中的元素,我阅读了有关寄存器函数的 method_to_typeid
属性来映射 exposed
中提到的 return 类型的函数,但我不知道不知道如何使用它。
谁能帮我解决这个问题,这样我就可以打印队列中的元素而不用将它们从队列中弹出
您只能通过代理使用引用对象的方法。由于PriorityQueue().queue
不是一个方法,而是一个实例属性,所以你需要提供一个方法来return这个属性的值。
下面的示例选择了具有子类化 PriorityQueue
.
get_attribute
方法
# Python 3.7.1
from queue import PriorityQueue
from multiprocessing.managers import SyncManager
from multiprocessing import Process
SENTINEL = None
class MyPriorityQueue(PriorityQueue):
def get_attribute(self, name):
return getattr(self, name)
class MyManager(SyncManager):
pass
def get_manager():
MyManager.register("PriorityQueue", MyPriorityQueue)
m = MyManager()
m.start()
return m
def f(q):
for item in iter(lambda: q.get()[1], SENTINEL):
print(item)
print(f'queue: {q.get_attribute("queue")}')
if __name__ == '__main__':
m = get_manager()
pq = m.PriorityQueue()
tasks = enumerate([f'item_{i}' for i in range(5)] + [SENTINEL])
for task in tasks:
pq.put(task)
print(f'queue: {pq.get_attribute("queue")}')
print(f'maxsize: {pq.get_attribute("maxsize")}')
p = Process(target=f, args=(pq,))
p.start()
p.join()
示例输出:
queue: [(0, 'item_0'), (1, 'item_1'), (2, 'item_2'), (3, 'item_3'), (4, 'item_4'), (5, None)]
maxsize: 0
item_0
item_1
item_2
item_3
item_4
queue: []