Utilizzo di un booleano per annullare il thread

0

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.

    
posta 17.07.2018 - 17:11
fonte

0 risposte

Leggi altre domande sui tag