Как я могу одновременно дождаться события потоковой передачи и опроса сокетов?Python

Программы на Python
Anonymous
Как я могу одновременно дождаться события потоковой передачи и опроса сокетов?

Сообщение Anonymous »

У меня есть объект select.poll() для входящих сообщений сокета и объект очереди.Queue(), который содержит потенциальные исходящие сообщения.
Хотя оба объекта по отдельности поддерживают ожидание таймаута без затрат циклов ЦП, мне нужно ждать обоих одновременно и возобновить поток, как только любой из них сработает. Есть ли для этого механизм?
Я пробовал ждать оба процесса за другим в цикле с очень коротким тайм-аутом, но по сути это ожидание с занятостью и в конечном итоге требует слишком много ресурсов ЦП. Я также попытался увеличить тайм-аут, что, как и ожидалось, освобождает процессор, но слишком сильно увеличивает задержку.
Похоже, что select.poll() может ожидать любого файлового дескриптора UNIX. , поэтому, возможно, другой способ задать мой вопрос: существует ли альтернатива очереди.Queue() или threading.Event(), которая предоставляет дескриптор файла, который можно опросить?
Текущая
import socket
import select
import queue
import threading

socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket.connect(('localhost', 4200))
incoming = select.poll()
incoming.register(socket, select.POLLIN)

outgoing = queue.Queue()

while True:
if incoming.poll(timeout=0.001):
read(socket)
try:
msg = outgoing.get(block=False, timeout=0.001)
send(socket, msg)
except queue.Empty:
pass

Желательно
import socket
import queue
import threading

socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket.connect(('localhost', 4200))
outgoing = queue.Queue()

poller = HYBRID_POLLER() # TODO
poller.register(socket)
poller.register(outgoing)

while True:
available = poller.poll(timeout=1)
if socket in available:
read(socket)
if outgoing in available:
msg = outgoing.get(block=False, timeout=0.001)
send(socket, msg)


Подробнее здесь: https://stackoverflow.com/questions/790 ... -same-time

Вернуться в «Python»