Jak rozumiem, asynchroniczne operacje we/wy nie są identyczne z niezablokowanymi we/wy.
W przypadku non-blocking I/O, gdy deskryptor pliku jest ustawiony jako „non-blokowanie”, wywołanie systemowe read()
(na przykład) powróci EWOULDBLOCK
(lub EAGAIN
), jeśli operacja odczytu będzie blokować proces wywołujący w celu zakończenia operacji. System wywołuje select()
, poll()
, epoll()
itp., Które są dostarczane w taki sposób, aby proces mógł poprosić system operacyjny o powiadomienie, gdy jeden lub więcej deskryptorów plików stanie się dostępnych do wykonania operacji we/wy.
Asynchroniczne operacje we/wy działają poprzez kolejkowanie żądania dla operacji we/wy do deskryptora pliku, śledzone niezależnie od procesu wywołującego. Dla deskryptora pliku, który obsługuje asynchroniczne operacje we/wy (typowe dyski na dysku surowym), proces może wywołać aio_read()
(na przykład), aby zażądać odczytania pewnej liczby bajtów z deskryptora pliku. Wywołanie systemowe natychmiast powraca, bez względu na to, czy operacje we/wy zostały zakończone. Po pewnym czasie proces następnie sonduje system operacyjny pod kątem operacji wejścia/wyjścia (to znaczy, że bufor jest wypełniony danymi).
Proces (jednowątkowy), który wykonuje tylko nie blokujące operacje we/wy, będzie mógł odczytać lub zapisać z jednego deskryptora pliku, który jest gotowy do operacji we/wy, gdy inny nie jest gotowy. Jednak proces musi nadal synchronicznie wywoływać wywołania systemowe, aby wykonać operacje we/wy dla wszystkich gotowych deskryptorów plików. Natomiast w asynchronicznym przypadku We/Wy proces polega jedynie na sprawdzeniu zakończenia operacji we/wy (bufor wypełniony danymi). Przy asynchronicznym I/O, OS ma swobodę działania równolegle w jak największym stopniu, aby obsługiwać I/O, jeśli tak wybierze.
Czy są tam jakieś opakowania dla POSIX aio_read/write itp. Wywołania systemowe dla Pythona?
Niestety O_NONBLOCK (czego API fdesc link do naprawdę robi) nie działa lokalne pliki na dysku twardym. tj. specyfikacja POSIX mówi, że powinna być zignorowana i jest obowiązkowo ignorowana w każdym systemie UNIX, jaki znam. Jeśli uważasz, że to głupi pomysł, nie mogłem się z tym zgodzić, ale jest wiele powodów historycznych i wdrożeniowych, dlaczego tak jest. Krótko mówiąc, jeśli chcesz asynchroniczne IO do lokalnych plików na dysku twardym, lepiej korzystaj z wątków i odkładaj IO do wątku IO lub korzystaj z API AIO. – mathieu