У меня есть сценарий с двумя потоками:
-
поток, ожидающий сообщений из сокета (встроенный в библиотеку C - блокирующий вызов - это "Barra.ricevi" ), затем помещая элемент в очередь
-
поток, ожидающий, чтобы получить элемент из очереди и сделать что-то
Пример кода
import Barra
import Queue
import threading
posQu = Queue.Queue(maxsize=0)
def threadCAN():
while True:
canMsg = Barra.ricevi("can0")
if canMsg[0] == 'ERR':
print (canMsg)
else:
print ("Enqueued message"), canMsg
posQu.put(canMsg)
thCan = threading.Thread(target = threadCAN)
thCan.daemon = True
thCan.start()
while True:
posMsg = posQu.get()
print ("Messagge from the queue"), posMsg
В результате каждый раз, когда новое сообщение поступает из сокета, в очередь добавляется новый элемент, но основной поток, который должен получать элементы из очереди, никогда не проснулся.
Вывод следующий:
Заданное сообщение
Заданное сообщение
Заданное сообщение
Заданное сообщение
Я ожидал:
Заданное сообщение
Messagge из очереди
Заданное сообщение
Messagge из очереди
Единственный способ решить эту проблему швов, чтобы добавить строку:
posQu.join()
в конце потока, ожидающего сообщения из сокета, и строки:
posQu.task_done()
в конце основного потока.
В этом случае после этого из сокета получено новое сообщение, поток блокируется, ожидая, пока основной поток обработает выделенный объект.
К сожалению, это не желаемое поведение, так как я хотел бы, чтобы поток всегда был готов получать сообщения из сокета и не дожидался завершения задания из другого потока.
Что я делаю неправильно? Благодаря
Andrew (Италия)