Wieloprocesorowość Kobza i Kolejka są oparte na anonimowych rurach, czy multiprocessing
Pythona zapewnia nazwane potoki (FIFO)?
Odpowiedzi:
1 dla odpowiedzi № 1Nie ma wbudowanej obsługi wieloplatformowej abstrakcji nazwanych potoków multiprocessing
.
Jeśli zależy Ci tylko na systemie Unix lub tylko na systemie Windows, możesz oczywiście utworzyć potoki nazwane ręcznie. W przypadku systemu Unix mkfifo
jest w stdlib. W systemie Windows musisz użyć ctypes
lub cffi
lub biblioteki innej firmy, takiej jak win32api
zadzwonić CreateFile
z odpowiednimi argumentami.
Próbując streścić różnice semantycznemiędzy tymi dwoma jest dość bolesne, prawdopodobnie dlatego stdlib nie próbuje tego zrobić. (Na przykład, nazwy nazwane potoków są niestabilne, a potoki nazw posix są trwałe).
Oto trywialny przykład Uniksa:
import multiprocessing
import os
def child():
with open("mypipe", "rb") as p:
print(p.read())
def main():
try:
os.mkfifo("mypipe")
except FileExistsError:
pass
multiprocessing.Process(target=child).start()
with open("mypipe", "wb") as p:
p.write(b"hi")
os.remove("mypipe")
if __name__ == "__main__":
main()
1 dla odpowiedzi nr 2
class multiprocessing.connection.Listener ([adres [, family [, backlog [, authkey]]]])
Opakowanie dla powiązanego gniazda lub nazwanego potoku Windows, które nasłuchuje na adres connections.address, jest adresem używanym przez związany socket lub nazwaną potokę obiektu listenener.