LINUX.ORG.RU

Модель прерываний в питоне

 , прерывания


0

3

Как грамотно сделать? Программа взаимодействует с железкой. Посылает в нее команды и принимает ответы. Но ответы могут приходить с серьезной задержкой, вплоть до многих секунд. В это время программа должна не тупо ждать, а слать в железку следующие команды, они там внутри встают в очередь исполнения. В то же время, когда пришел ответ, на это заметить и выполнить действия.

В общем, получается довольно классическая модель работы прерываний. Вот только все это надо на питоне.

★★★★★

Последнее исправление: cvs-255 (всего исправлений: 1)

Возьми какой-нибудь асинк фреймворк вроде asyncio или twisted.

PolarFox ★★★★★
()

Если в терминах asyncio, то схема такая:

q = asyncio.Queue()

...

while True:
    listener_task = asyncio.ensure_future(transport.receive())
    sender_task = asyncio.ensure_future(q.get())

    done, pending = await asyncio.wait([listener_task, sender_task],
                                       return_when=asyncio.FIRST_COMPLETED)

    if listener_task in done:
        # обработка ответа
        answer = listener_task.result()

    if sender_task in done:
        # шлём команду
        message = sender_task.result()
        transport.send(message)

...
# совсем в другом месте формируем сообщения на отправку
await q.put(message)

P.S. Очень похоже на реализацию работы с вебсокетами.

vvn_black ★★★★★
()
Последнее исправление: vvn_black (всего исправлений: 3)
Ответ на: комментарий от conformist

Нет, питон крутится на обычном компьютере

cvs-255 ★★★★★
() автор топика

прерывание-то от железки должен обработчик прерываний в ядре отработать, а потом уж через какой eventfd и юзер спейс уведомить.

dimon555 ★★★★★
()

А что в питоне потоков разве нет? Просто используй каждый поток для своей задачи.

Bobby_
()

В Python нет прерываний. И к устройству из Python ты обратиться не можешь (если у тебя не MicroPython или что-то подобное). Python может обращаться только к драйверу устройства, и надо смотреть, что предоставляет драйвер. Скорее всего, это poll (в Python - это select.select). Умников, советующих asyncio, слушать не следует - asyncio сделано для ситуации, когда клиентов очень много.

В общем, получается довольно классическая модель работы прерываний.

Получается довольно классическая модель очередей сообщений.

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от Deleted

В итоге я сделал отдельный поток, который слушает сообщения от железки и обрабатывает их.

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от Deleted

Как доведу программу до более менее стабильного состояния, отдельно напишу еще.

cvs-255 ★★★★★
() автор топика
Последнее исправление: cvs-255 (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.