2008-11-25 16 views

Odpowiedz

3

Twisted ma non-blocking writes on file descriptors. Jeśli piszesz kod asynchroniczny, spodziewałbym się, że i tak użyjesz skrętu. :)

+10

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

17

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?

+0

Jedna rzecz do dodania: jak komentuje pierwsza odpowiedź, żaden system faktycznie nie śledzi O_NONBLOCK na plikach - to naprawdę tylko dla gniazd. Jeśli chcesz mieć przenośny plik asynchroniczny IO na Unixie, musisz użyć POSIX AIO lub odłączyć swój synchroniczny IO do wątku. –

0

Python 3 wydaje się mieć taką funkcjonalność. Zobacz PEP 3116.

+1

Wygląda na to, że PEP 3116 jest powiązany z nową abstrakcją we/wy, która zawiera nie blokujące operacje we/wy. Jednak nie blokujące operacje we/wy nie są takie same jak asynchroniczne operacje we/wy. Non-blocking I/O zasadniczo nie ma zastosowania do lokalnych zapisów systemu plików. –

2

Zajmuję aio.h bidings do Python: pyaio

To działa tylko na linux ..

Powiązane problemy