С помощью обычного списка я мог бы отсортировать список на основе атрибута объектов с помощью:
queue.sort(key=lambda weed: (weed.x_coord), reverse=True)
Однако, с многопроцессорной очередью это было невозможно, так как я могу выполнить sh такую же сортировку с многопроцессорной очередью? Или лучше избегать многопроцессорной очереди, если я хочу, чтобы очередь сортировалась в конце?
Требование состоит в том, что очередь / список должны быть поточно-ориентированными и безопасными для обработки, поскольку очередь / список будет заполняться двумя параллельными потоками.
Два процесса (p1 и p2) вставка объектов в общую очередь будет продолжаться параллельно с третьим процессом (конечным автоматом), который читает из очереди (см. код ниже). Т.е. процесс конечного автомата будет не ожидать окончания процесса p1 и p2.
Реализация пока:
import multiprocessing
class Weed():
x=None
y=None
def __init__(self,x,y):
self.x=x
self.y=y
def p1(q):
"""
Function that inserts weed in the shared queue
"""
# append squares of mylist to queue
q.put(Weed(10.1,7.3))
q.put(Weed(8.3,2.8))
q.put(Weed(5.1,4.2))
q.put(Weed(15.4,5.0))
def p2(q):
"""
Function that inserts weed in the shared queue
"""
# append squares of mylist to queue
q.put(Weed(25.1,1))
q.put(Weed(1.3,1))
q.put(Weed(9.1,1))
q.put(Weed(13.4,1))
def state_machine(q):
"""
Function that sorts the queue (w.r.t x-coord.) and prints it out
"""
print("Queue elements:")
while not q.empty():
q.sort(key=lambda x: (x.x), reverse=True) # Gives error -
print(q.get().x)
print("Queue is now empty!")
if __name__ == "__main__":
# creating multiprocessing Queue
q = multiprocessing.Queue()
# creating new processes
p1 = multiprocessing.Process(target=p1, args=(q,))
p2 = multiprocessing.Process(target=p2, args=(q,))
p3 = multiprocessing.Process(target=state_machine, args=(q,))
# running process p1 to generate some weeds
p1.start()
# running process p2 to generate some weeds
p2.start()
# running process p3 to sort the weed queue (by x coord.) and print them out
p3.start()
p1.join()
p2.join()
p3.join()