Path: csiph.com!fu-berlin.de!uni-berlin.de!not-for-mail From: Stefan Schwarzer Newsgroups: de.comp.lang.python Subject: =?utf-8?q?=5BPython-de=5D_Re=3A_Code_Style_Review?= Date: Tue, 29 Nov 2022 18:51:17 +0100 Lines: 64 Message-ID: <3d4a86fc-9794-30bb-4f28-6154caf24cfa@sschwarzer.net> References: <480b80d21e58d280c437b4854bfc7cf1@posteo.de> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-Trace: news.uni-berlin.de a0/irTXHFwAUYpa0eIe8VAPyS1hLANxhCDehK4LXPcKQ== Authentication-Results: mail.python.org; dkim=none reason="no signature"; dkim-adsp=none (unprotected policy); dkim-atps=neutral User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.24) Gecko/20100411 Thunderbird/2.0.0.24 Mnenhy/0.7.6.666 Content-Language: en-US, de-DE In-Reply-To: X-Provags-ID: V03:K1:xf6a3ebrzmCz9AUNrDTFYrq1m4V08HRuzIvft1WGV+ylfcnYQiJ aXxzvqPZEMQNi4LiX4M3JYAXMG1XErL/bjYAH1u0idD3FIPV1kvkjwD2Ok5NT6GdAuHmRs+ jlaXMHLcUWmESJCm3i/E8fSI/ihZ1T5aPz1bp6F/1akBbXvoQwP+Ki1jli2F4Q7upeMoDRe eLgFi5wtzACerjbNL0Nqw== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1;V03:K0:T7sp0cBOWsM=:xxBK8YXDNH1XczExU3zRWl lLYSsQWJ1LHyWWYuxqDK/3Id1Ppz02gbf+jhpyjnvx9m2tWm0DbDGulLx06HVl8bMCc0LgfS8 d4sCCwonWpyCaRGzwshzrFxcDRFrFiQYqDPuN0+mwyWC1uIlog3DTMUwa83cyIxbMrISvkTUx PtpP+0kRTORBSN78HJCVg7DxXGJWAVBP7jMzdrrbMyS76Azf73+fLRObIm259a8hIhVyOumJc NJyH0ebXSYY52WZ+MSOylN5T3qAU5bT5yJD3cu1tvzX4L/90eLrPIFkzoVjSGwYxgcIdjOifb CEkKM2mVJ2Dchamxw0dDI/1zolOPcNv/+TSFaNVMb5CSSP78ScDO5dkMTPNpIcAhCrY4t5UVF mt/IrPjkj3oI1KsdpCOUz2qFHLxE5czhuMX+WdyVj3ySC9xTdCYT6YzbYRnMxDKUU8QfAnGZ8 u/5FACBmIn5+FSasI7yqOvFzR4MrF6DarwQXHLfEa8EWsZT3/Csxdr9RZg5xkOgoOpy484Ws2 alMzgAtufxq1j6kzz7IA4sNZppCK2LM4iodCZm2HQ1CMIymhE+wK3Fw4LVQOxfD3vK1YV40sA HNpxi3XRi9ocEh5vxArS8WBkfrMKqZ3gGR5WFNhDqs6PL2zo+n+oujWqV1pMtiQ/TANaaR/mT kDZL/x6FtyWHAxF0GEhojh3WGFejr2KgqRzGeUyBJr70owl4h5cFqONJ3RkizqnYqbeOd3/f4 lmDjuItw/yNX1bs0nUbe4Z5l4e5IwzT04EdILuZh4cxXGocJdb9/c6I5WRrV7LYhJCPGKaf7N rXVN422a5g5Qst3UsbyR3Tn7wC8bw== Message-ID-Hash: RHSNU6S6CWCELVTUKTFJSX3EGNGKGNHN X-Message-ID-Hash: RHSNU6S6CWCELVTUKTFJSX3EGNGKGNHN X-MailFrom: sschwarzer@sschwarzer.net X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-python-de.python.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.7 Precedence: list List-Id: Die Deutsche Python Mailingliste Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: Xref: csiph.com de.comp.lang.python:5876 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