[Python-de] Re: Code Style Review
Stefan Schwarzer <[email protected]>
| Newsgroups | gmane.comp.python.general.german |
|---|---|
| Message-ID | <[email protected]> |
On 2022-11-28 22:07, Marc Haber wrote: > Kann ich die Locks innerhalb der entsprechenden Funktion definieren > oder bekomme ich dann in jedem Thread ein eigenes Lock, was der > Intention entgegen spricht? > > Ist: > > foolock = threading.Lock() > def foo: > with foolock: > (tue Dinge mit foo, potenziell multithreaded) > > dasselbe wie > > def foo: > foolock = threading.Lock() > with foolock: > (tue Dinge mit foo, potenziell multithreaded) > > ? Die Ansätze sind _nicht_ gleichwertig. Wie du richtig erkannt/vermutet hast, definierst du im zweiten Ansatz bei Ausführung von `foo` "on the fly" ein Lock-Objekt. Dieses hat mit anderen Lock-Objekten, die in anderen Threads in `foo` erzeugt werden, nichts zu tun. Das Lock ist damit wirkungslos (vielleicht mal abgesehen von dem Sonderfall, dass du das Lock in anderen Aufrufen im `with`-Block weiterreichst, aber das ist eine ganz andere Semantik, die du hier vermutlich nicht im Sinn hast :-) ). > Ist die in > https://www.bogotobogo.com/python/Multithread/python_multithreading_Using_Locks_with_statement_Context_Manager.php > und > https://www.pythontutorial.net/python-concurrency/python-threading-lock/ > verwendete Schreibweise, wo das Lock als Parameter mit in die Funktion > hineingereicht wird, wirklich "schönes" Python? Allgemein würde ich nicht `acquire` und `release` explizit verwenden beziehungsweise die meisten der Situationen, wo man `acquire` und `release` verwendet, können mit einem `with some_lock:` übersichtlicher geschrieben werden. > Oder schreibe ich mein ganzes Programm als eine Klasse, die genau > einmal instanziiert wird und dann in ihren statischen Variablen (so > wäre es in C++) die Tabelle, die Konfiguration, die Locks, den > Debugstatus etc hält? Sind solche Ein-Instanz-Klassen "schönes" > Python? Ich kenne so etwas unter dem Namen "Active Object"-Pattern; jedenfalls nehme ich an, dass das gemeint ist (auch wenn es sich aus meiner Sicht etwas wüst anhört, ganz verschiedene Sachen in die Instanz zu packen, falls das so gemeint ist). Ein weiterer Ansatz ist, Queues zur Synchronisation zu verwenden, was tendenziell deutlich weniger fehleranfällig ist. Ich habe vor ein paar Jahren einen Vortrag zu Nebenläufigkeit in Python gehalten, der auch Queues und Active Objects behandelt: https://sschwarzer.com/download/concurrency_pycon_de2018.pdf Viele Grüße Stefan _______________________________________________ python-de Mailingliste -- [email protected] Zur Abmeldung von dieser Mailingliste senden Sie eine Nachricht an [email protected] https://mail.python.org/mailman3/lists/python-de.python.org/ Mitgliedsadresse: [email protected]