ylab xaxis tick font python nonblocking fifo

python - xaxis - r plotly title



¿Cómo leer el nombre FIFO sin bloqueo? (2)

Creo un FIFO y lo abro periódicamente en modo de solo lectura y sin bloqueo desde a.py:

os.mkfifo(cs_cmd_fifo_file, 0777) io = os.open(fifo, os.O_RDONLY | os.O_NONBLOCK) buffer = os.read(io, BUFFER_SIZE)

Desde b.py, abre el fifo para escribir:

out = open(fifo, ''w'') out.write(''sth'')

Entonces a.py generará un error:

buffer = os.read(io, BUFFER_SIZE) OSError: [Errno 11] Resource temporarily unavailable

Alguien sabe lo que está mal?


De acuerdo con la página de manual de read(2) :

EAGAIN or EWOULDBLOCK The file descriptor fd refers to a socket and has been marked nonblocking (O_NONBLOCK), and the read would block. POSIX.1-2001 allows either error to be returned for this case, and does not require these constants to have the same value, so a portable application should check for both possibilities.

Entonces, lo que está obteniendo es que no hay datos disponibles para leer. Es seguro manejar el error de esta manera:

try: buffer = os.read(io, BUFFER_SIZE) except OSError as err: if err.errno == errno.EAGAIN or err.errno == errno.EWOULDBLOCK: buffer = None else: raise # something else has happened -- better reraise if buffer is None: # nothing was received -- do something else else: # buffer contains some received data -- do something with it

Asegúrese de que tiene el módulo errno importado: import errno .


out = open(fifo, ''w'')

¿Quién lo cerrará por ti? Reemplaza tu open + write por esto:

with open(fifo, ''w'') as fp: fp.write(''sth'')

UPD: Ok, que simplemente haga esto:

out = os.open(fifo, os.O_NONBLOCK | os.O_WRONLY) os.write(out, ''tetet'')