У меня есть сценарий с 2 нитями:Python threading with queue: как избежать использования соединения?
поток ждет сообщений из сокета (встроенный в библиотеке 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()
в конце главного потока.
В этом случае после этого новое сообщение принимается из сокета, поток блокируется, ожидая, пока основной поток обработает выделенный объект.
К сожалению, это неправильное поведение, так как я хочу, чтобы поток всегда был готов получать сообщения из сокета и не дожидался завершения задания из другого потока.
Что я делаю неправильно? Благодаря
Эндрю (Италия)
Можете ли вы дать нам самодостаточный пример, который не требует библиотеки 'Barra'? Потому что, когда я заменяю код кодом, который просто дает ему случайное значение, он работает так, как вам бы хотелось. Поэтому я подозреваю, что есть проблема в другом коде, а не в этом коде. – abarnert
Поскольку Pastebin, похоже, сейчас работает, вот что изменилось: замените 'import Barra'' import random' и 'canMsg = barra.cicevi (« can0 »)' с 'canMsg = ['ERR'], если он случайный. random() <.25 else [0, 1, 2] ', а затем запустите свой код, и вы увидите чередующиеся очереди и сообщения (часто в одной строке). – abarnert
Кроме того, действительно ли CAN-bus имеет какое-либо отношение к этой программе? (Возможно, вы используете встроенную систему linux, у которой нет pthreads, поэтому она использует фиктивные потоки? Возможно, это может вызвать эту проблему ...) – abarnert