Ho chiesto una domanda simile a questo su SO, ma dopo averlo riletto stamattina, mi sono reso conto che non era chiaro cosa stavo chiedendo. Così ho ristretto il mio problema e ho capito che si trattava di un modello invece di un problema di codifica.
Ho trovato questa domanda , ma è correlata a C # e Tasks
, ma segue le stesse linee.
Supponiamo che sto usando una discussione per scaricare un file con l'opzione di cancellazione:
import threading
class DownloadThread(threading.Thread):
def __init__(self):
self._keep_download_active = True
def run(self):
while self.keep_download_active):
# code to download file
def cancel(self):
self._keep_download_active = false
Python ha oggetti Event
. Secondo i documenti:
This is one of the simplest mechanisms for communication between threads: one thread signals an event and other threads wait for it
Molto simile al collegamento C # dichiarato su CancellationToken
, Event
è thread-safe. Il che significa che posso scrivere il mio codice in questo modo:
import threading
class DownloadThread(threading.Thread):
def __init__(self):
# threading.Event() is false by default
self._stop_download = threading.Event()
def run(self):
while self._stop_download:
# code to download file
def cancel(self):
self._stop_download.set()
Nota, nel primo esempio non sto passando un boolean
nel costruttore, lo sto dichiarando in constructor
, e viene mantenuto privato ( _
indica al lettore di trattarlo come privato ).
Dato questo contesto attuale, si sta prendendo in considerazione l'odore del codice? Sarebbe meglio usare ciò che viene fornito dalla lingua, in questo caso il secondo esempio?
Se il boolean
è stato passato a constructor
, allora posso vedere che è un odore di codice, perché quindi quella variabile potrebbe essere condivisa tra più thread e causare condizioni di competizione.