A causa del Global Interpreter Lock, il multithreading in Python non influisce sul parallelismo. Questa limitazione viene evitata nella libreria multiprocessing
generando invece nuovi processi. Ma il threading migliora la reattività in determinate situazioni (legate all'IO). (da questa risposta su SO).
La mia situazione è la seguente. Viene comunicato un processo Python utilizzando stdin
e stdout
. Una riga corrisponde a un messaggio e viene soddisfatta con una riga di risultato. Attualmente ho un singolo processo che consuma i messaggi uno per uno e produce un risultato. Tuttavia, l'elaborazione implica calcoli moderatamente pesanti, pertanto è possibile ottenere prestazioni migliori con calcoli paralleli di richieste diverse.
Dopo aver letto le differenze e gli usi del threading e del multiprocessing, ho trovato una struttura che si spera possa soddisfare questo compito.
- I messaggi dovrebbero essere gestiti in modo asincrono per consentire la lettura dello stdin e la distribuzione del lavoro prima di restituire i risultati. Due thread potrebbero essere generati per gestire la lettura e la scrittura.
- È possibile generare più processi per rispondere a tali richieste. Un esempio della documentazione
multiprocessing
: qui (# 3: utilizzo delle code)
Come l'esempio higlights (con tempi di sospensione casuali), l'ordine di risposta non è fisso. I lavori vengono restituiti nell'ordine in cui sono terminati.
È un design sensato? Inoltre, cosa si potrebbe fare per preservare l'ordine dei messaggi nella pipeline?