[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]
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.