Как использовать функцию select () с файлами - PullRequest
0 голосов
/ 17 февраля 2019

Я пытаюсь понять, как select() работает как функция в Unix.У меня есть рабочий образец с сокетом, но у меня проблема с ним при использовании файлов.При использовании select() на файловом объекте он не ждет - вместо этого он продолжает непосредственно код, потом напрямую.

Этот пример работает хорошо:

import socket
from select import select

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind(("127.0.0.1", 1111))
server_socket.listen(5)

# this function wait when server_socket descriptor will change
read, write, error = select([server_socket], [], [])

# this part print when I use "nc 127.0.0.1 1111"
print(server_socket)

Но когда я пытаюсьиспользовать тот же код с файлами, у меня неожиданный результат.

import os
import fcntl
from select import select

file_descriptor = os.open('/tmp/test_file', os.O_CREAT)

# lock file? I try to use lockf, other options
fcntl.flock(file_descriptor, os.F_LOCK | os.O_SHLOCK)

# I think that select must wait when the file will be unlocked
read, write, error = select([], [file_descriptor], [])

# prints immediately
print(file_descriptor)

1 Ответ

0 голосов
/ 17 февраля 2019

в Unix или os на его основе, например, в osx, вы должны использовать pipe.

из python doc

Обратите внимание, что в Windows это работает только для сокетов;в других операционных системах он также работает для других типов файлов (в частности, в Unix он работает на каналах).Его нельзя использовать для обычных файлов, чтобы определить, вырос ли файл с момента его последнего чтения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...