Meta tags:
description= Python Threading von Grund auf: Threads erstellen, mit Locks synchronisieren, Queues, ThreadPoolExecutor nutzen und den GIL verstehen.;
Headings (most frequently used words):
thread, und, threads, lock, threading, event, semaphore, python, einen, erstellen, starten, mehrere, gleichzeitig, ausführen, als, unterklasse, daemon, namen, inspektion, synchronisierung, data, races, verhindern, koordinieren, lokale, daten, sichere, queues, threadpoolexecutor, verwaltete, pools, das, global, interpreter, gil, vs, asyncio, häufige, fallstricke, kurzübersicht, übung, schlüsselwortargumente, übergeben, rlock, re, entranter,
Text of the page (most frequently used words):
#thread (88), threading (72), python (67), #threads (65), sie (42), for (31), time (30), lock (28), import (28), start (27), print (27), und (26), das (23), ein (22), join (22), auf (21), kopieren (19), die (19), def (19), für (18), einen (18), target (18), der (18), example (18), com (18), https (16), lernen (15), eine (15), url (15), queue (14), ist (14), matplotlib (14), daemon (13), erstellen (13), den (13), item (13), mysql (13), wenn (12), mongodb (12), from (11), worker (11), mit (11), verwenden (11), name (11), counter (11), alle (10), als (10), the (10), signal (10), von (10), futures (10), range (10), sleep (10), connection (10), asyncio (9), event (9), semaphore (9), with (9), args (9), elemente (9), threadpoolexecutor (8), data (8), gleichzeitig (8), oder (8), user (8), listen (8), html (7), gil (7), mehrere (7), starten (7), using (7), true (7), nicht (7), concurrent (7), können (7), aufgaben (7), set (7), running (7), strings (7), code (6), global (6), interpreter (6), cpu (6), consumer (6), einem (6), wird (6), des (6), perf_counter (6), executor (6), future (6), api (6), ohne (6), main (6), self (6), string (6), w3docs (5), tools (5), sichere (5), verhindern (5), producer (5), rlock (5), lesen (5), locks (5), and (5), cpu_bound (5), consumed (5), produced (5), datenbank (5), releasing (5), inner (5), tutorial (5), tuples (5), methoden (5), formatter (5), color (5), json (4), generator (4), daten (4), koordinieren (4), list (4), kann (4), erwerben (4), nur (4), beendet (4), lock_a (4), lock_b (4), deadlock (4), andere (4), dies (4), jede (4), gebundene (4), aufgabe (4), 5_000_000 (4), map (4), response (4), result (4), urls (4), simulate (4), none (4), local_data (4), ready (4), acquired (4), outer (4), werden (4), übergeben (4), finished (4), downloaded (4), dateien (4), entfernen (4), erste (4), schritte (4), regression (4), dictionaries (4), listenelemente (4), durchlaufen (4), encoder (3), editor (3), quizze (3), übungen (3), php (3), javascript (3), css (3), übung (3), verwaltete (3), pools (3), queues (3), synchronisierung (3), races (3), namen (3), ausführen (3), this (3), page (3), network (3), same (3), tasks (3), most (3), max_workers (3), local (3), abschnitt (3), warten (3), schreiben (3), während (3), order (3), zwei (3), halten (3), wartet (3), immer (3), wie (3), programm (3), sind (3), objekt (3), aus (3), hat (3), zurück (3), bibliotheken (3), arbeit (3), async (3), auch (3), jeder (3), two (3), elapsed (3), threaded (3), single (3), total (3), return (3), beschleunigen (3), läuft (3), auszuführen (3), parallel (3), objekte (3), all (3), get (3), cons (3), put (3), prod (3), received (3), while (3), current_thread (3), work (3), wait (3), run (3), abgeschlossen (3), still (3), download (3), port (3), host (3), kwargs (3), variablen (3), sets (3), hinzufügen (3), zugreifen (3), italiano (2), português (2), español (2), français (2), русский (2), deutsch (2), english (2), beautifier (2), diff (2), password (2), java (2), git (2), bücher (2), beispiele (2), snippets (2), kurzübersicht (2), häufige (2), fallstricke (2), lokale (2), inspektion (2), unterklasse (2), virtuelle (2), umgebungen (2), loop (2), which (2), following (2), would (2), benefit (2), pool (2), wiederverwendbarer (2), fifo (2), muster (2), speicher (2), entranter (2), hintergrund (2), markieren (2), beenden (2), ende (2), neuen (2), zweck (2), werkzeug (2), schützen (2), runtimeerror (2), modifizieren (2), anderer (2), always (2), acquire (2), holds (2), waits (2), indem (2), eines (2), nebenläufigkeit (2), eigentliche (2), noch (2), machen (2), wirklich (2), aufrufen (2), löst (2), ausführung (2), neue (2), zweimal (2), multiprocessing (2), aiohttp (2), erfordert (2), await (2), coroutinen (2), pro (2), overhead (2), sicher (2), einer (2), einzelnen (2), nach (2), prozess (2), eigenen (2), not (2), freigegeben (2), dieses (2), verhalten (2), cpython (2), standard (2), erlaubt (2), dass (2), liefert (2), as_completed (2), results (2), square (2), posts (2), comments (2), users (2), submit (2), fetch_url (2), wann (2), task_done (2), stop (2), dem (2), modul (2), wurde (2), set_user (2), werte (2), nützlich (2), only (2), use_connection (2), bis (2), starting (2), sending (2), waiting (2), ruft (2), rufen (2), blockieren (2), methode (2), 500000 (2), final (2), safe_increment (2), read (2), modify (2), write (2), 100_000 (2), stellt (2), ihn (2), kontextmanager (2), damit (2), unsafe_increment (2), sich (2), überlappen (2), prozesses (2), active (2), workerthread (2), active_count (2), setzen (2), automatisch (2), zuweisen (2), datei (2), exiting (2), will (2), killed (2), heartbeat (2), downloadthread (2), __init__ (2), downloads (2), data3 (2), data2 (2), data1 (2), connecting (2), 443 (2), connect (2), schlüsselwortargumente (2), tupel (2), hello (2), alice (2), started (2), continues (2), greet (2), http (2), handling (2), zahlen (2), klassen (2), limit (2), update (2), drop (2), collection (2), delete (2), insert (2), grid (2), einführung (2), schleifen (2), verbinden (2), ändern (2), hash (2), 2026, rechte, vorbehalten, entwickler, gemacht, sprache, datenschutzrichtlinie, kontakt, über, uns, unternehmen, probier, üben, kostenlose, tutorials, web, seit, 2014, next, previous, yes, was, helpful, prüfen, training, neural, matrix, multiplications, sorting, large, memory, intensive, algorithm, downloading, 100, files, internet, computing, first, million, digits, pure, verwalteter, spezifischer, gleichzeitige, begrenzen, einmaliges, zwischen, derselbe, mehrfach, gegenseitiger, ausschluss, beim, zugriffe, gemeinsam, genutzte, sammlungen, vermeiden, changed, size, during, iteration, liste, darüber, iteriert, fix, then, every, tritt, jeweils, derselben, reihenfolge, allen, sperren, großen, codeblocks, macht, zunichte, gesperrte, abschnitte, kurz, möglich, lese, modifiziere, schreib, operation, lange, gejoined, laufen, endet, joinen, deren, abschluss, wichtig, daemons, fire, forget, vergessen, dasselbe, mehr, einmal, instanz, bibliothek, kompatible, version, statt, greifen, synchrone, blocking, angewiesen, requests, faustregel, durchgehend, vertraut, synchroner, stil, lernkurve, sehr, gering, tausende, innerhalb, explizite, gemeinsamer, zustand, unterstützung, asyncpg, blockierende, drittanbietern, besten, kooperativ, geben, bei, präemptiv, wechselt, nebenläufigkeitsmodell, sowohl, programme, schneller, aber, funktionieren, unterschiedlich, echte, parallelität, stattdessen, seinen, processpoolexecutor, are, faster, similar, prevents, parallelism, sequential, durch, kontextwechsels, sogar, leicht, langsamer, sein, tatsächlich, netzwerkantwort, obigen, demonstrieren, praktische, konsequenz, besitzt, mutex, bytecode, bedeutet, keinen, mehreren, kernen, bewahrt, eingabereihenfolge, ausgabe, anders, abschlussreihenfolge, kürzere, form, keine, benötigen, iterable, may, vary, objects, objekts, verschwenderisch, viele, kurzlebige, haben, verwaltet, gibt, übermittelte, bietet, zum, verfolgen, warteschlange, befindlichen, verarbeitet, wurden, sowie, alternative, reihenfolgen, priorityqueue, lifoqueue, break, sentinel, when, maxsize, klassische, erzeugen, verarbeiten, klasse, standardbibliotheks, einfügen, entnehmen, gesamte, intern, gehandhabt, nie, gesetzt, genau, attributzugriff, attributeerror, user2, user1, user0, each, writes, its, own, copy, erstellt, separate, hält, spezifische, caches, cursor, allow, enter, critical, section, once, begrenzt, anzahl, betreten, ratenbegrenzung, zugriffs, gemeinsame, ressource, verbindungspool, startreihenfolge, beispielsweise, verzögern, datenbankverbindung, hergestellt, blocks, here, until, called, einfaches, signalisieren, eintrifft, works, because, counts, acquisitions, also, acquires, denselben, muss, ebenfalls, erwirbt, erneut, verursachen, demselben, now, one, can, before, geschützten, ausführt, ausnahme, ausgelöst, somewhere, between, 100000, unpredictable, atomic, folgende, beispiel, unvorhersehbaren, endwert, inkrementierungen, verschiedener, teilen, dieselbe, variable, entsteht, deterministisches, schwer, reproduzieren, debuggen, race, explizit, lassen, laufenden, inspizieren, aktive, zählen, hintergrundüberwachung, logging, programms, sollen, niemals, sauber, müssen, schreibvorgänge, commits, jegliches, aufräumen, vor, page2, page1, page0, super, class, komplexere, logik, ableiten, überschreiben, speichern, ergebnisse, instanzattribute, aufrufende, würde, sekunden, dauern, sequenziell, drei, dauert, etwa, sekunde, wartezeiten, second, request, vorteil, besteht, darin, zuerst, dann, kehrt, sofort, haupt, bevor, gestartete, positionsargumenten, wichtige, punkte, finish, some, importieren, wobei, auszuführende, funktion, gegenüber, bevorzugen, warum, lastigen, kommunikation, hintergrundaufgaben, kapitel, behandelt, ermöglicht, leichtgewichtigen, ausführungseinheit, speicherbereich, teilt, richtige, ihr, meiste, zeit, liest, anfrage, abfragt, dieser, wartezeit, sinnvolle, erledigen, möchten, anstatt, selben, grund, synchronisieren, nutzen, verstehen, anfragen, pytest, pakete, tooling, best, practices, concurrency, csv, random, sys, itertools, collections, ausnahmen, auslösen, error, library, addieren, umkehren, duplikate, how, enums, abstrakte, kapselung, polymorphismus, dataclasses, static, classmethod, property, magic, methods, advanced, oop, match, anweisung, enumerate, zip, comprehensions, rekursion, closures, generatoren, decorators, type, hints, intermediate, sort, query, find, table, where, select, tabelle, einstieg, nearest, neighbors, auc, roc, kurve, cross, validation, bootstrap, aggregation, means, kategoriale, search, logistische, hierarchisches, clustering, konfusionsmatrix, entscheidungsbaum, train, test, skalierung, multiple, polynomiale, lineare, streudiagramm, normalverteilung, datenverteilung, perzentil, standardabweichung, mittelwert, median, modus, machine, learning, kreisdiagramme, histogramme, balken, scatter, subplot, beschriftungen, linie, marker, plotting, pyplot, django, scipy, pandas, numpy, modules, löschen, dateiverarbeitung, file, formatierung, benutzereingabe, try, except, pip, regex, math, datumsangaben, module, scope, iteratoren, vererbung, arrays, lambda, funktionen, else, tupeln, gruppieren, operatoren, booleans, casting, datentypen, kommentare, syntax, variablennamen, aktualisieren, entpacken, tuple, sortieren, slicen, home, ausgabevariablen, verschachtelte, comprehension, zusammenführen, globale, format, escape, zeichen, dictionary, verketten, anmelden, durchsuchen, formatters, reverse, sha256, md5, length, calculator, colors, hsl, hex, mixer, converter, picker, general, kurse,
Text of the page (random words):
n python asyncio threading python tooling and best practices virtuelle umgebungen pakete pytest http anfragen python threading python threading von grund auf threads erstellen mit locks synchronisieren queues threadpoolexecutor nutzen und den gil verstehen das threading modul von python ermöglicht es mehrere aufgaben im selben prozess gleichzeitig auszuführen jede aufgabe läuft in einem eigenen thread einer leichtgewichtigen ausführungseinheit die den speicherbereich des prozesses teilt threading ist das richtige werkzeug wenn ihr programm die meiste zeit wartet eine datei liest eine http anfrage stellt eine datenbank abfragt und sie während dieser wartezeit sinnvolle arbeit erledigen möchten anstatt zu blockieren dieses kapitel behandelt threads erstellen und starten mit threading thread auf das ende von threads warten mit join daemon threads und hintergrundaufgaben data races verhindern mit lock und with threads koordinieren mit event und semaphore thread sichere kommunikation mit queue queue der threadpoolexecutor für verwaltete thread pools das global interpreter lock gil und warum threads cpu lastigen code nicht beschleunigen wann threading gegenüber asyncio zu bevorzugen ist einen thread erstellen und starten importieren sie threading und erstellen sie ein thread objekt wobei sie die auszuführende funktion als target übergeben rufen sie start auf um den thread zu starten import threading import time def greet name time sleep 0 5 simulate some work print f hello name t threading thread target greet args alice t start print thread started main continues running t join wait for the thread to finish print thread finished thread started main continues running hello alice thread finished kopieren wichtige punkte args ist ein tupel von positionsargumenten die an target übergeben werden verwenden sie kwargs für schlüsselwortargumente ohne join kann der haupt thread beendet werden bevor der gestartete thread abgeschlossen ist start kehrt sofort zurück der neue thread läuft parallel schlüsselwortargumente übergeben import threading def connect host port 80 print f connecting to host port t threading thread target connect kwargs host example com port 443 t start t join connecting to example com 443 kopieren mehrere threads gleichzeitig ausführen der eigentliche vorteil von threading besteht darin mehrere aufgaben parallel auszuführen starten sie zuerst alle threads und warten sie dann auf alle import threading import time def download url time sleep 1 simulate a 1 second network request print f downloaded url urls https example com data1 https example com data2 https example com data3 start time perf_counter threads threading thread target download args url for url in urls for t in threads t start for t in threads t join elapsed time perf_counter start print f all downloads finished in elapsed 1f s downloaded https example com data1 downloaded https example com data2 downloaded https example com data3 all downloads finished in 1 0s kopieren ohne threads würde dies 3 sekunden dauern sequenziell mit drei threads dauert es etwa 1 sekunde da sich die wartezeiten überlappen thread als unterklasse für komplexere logik können sie threading thread ableiten und run überschreiben speichern sie ergebnisse als instanzattribute damit der aufrufende code sie nach join lesen kann import threading import time class downloadthread threading thread def __init__ self url super __init__ self url url self result none def run self time sleep 0 5 simulate download self result f data from self url threads downloadthread f https example com page i for i in range 3 for t in threads t start for t in threads t join for t in threads print t result data from https example com page0 data from https example com page1 data from https example com page2 kopieren daemon threads ein daemon thread ist ein hintergrund thread den der interpreter automatisch beendet wenn alle nicht daemon threads abgeschlossen sind markieren sie einen thread als daemon indem sie daemon true übergeben oder t daemon true vor start setzen import threading import time def heartbeat while true print still running time sleep 1 t threading thread target heartbeat daemon true t start time sleep 2 5 print main thread exiting daemon will be killed still running still running main thread exiting daemon will be killed kopieren verwenden sie daemon threads für hintergrundüberwachung oder logging aufgaben die das beenden des programms nicht verhindern sollen verwenden sie sie niemals für aufgaben die sauber abgeschlossen werden müssen datei schreibvorgänge datenbank commits sie werden ohne jegliches aufräumen beendet thread namen und inspektion jeder thread hat einen namen sie können ihn explizit setzen oder python automatisch einen zuweisen lassen verwenden sie threading current_thread um den laufenden thread zu inspizieren und threading active_count um aktive threads zu zählen import threading def worker t threading current_thread print f running in thread t name t threading thread target worker name workerthread 1 t start t join print f active threads threading active_count running in thread workerthread 1 active threads 1 kopieren synchronisierung data races verhindern threads teilen den speicher des prozesses wenn zwei threads gleichzeitig dieselbe variable lesen und schreiben entsteht ein data race nicht deterministisches verhalten das schwer zu reproduzieren oder zu debuggen ist das folgende beispiel ohne lock liefert einen unvorhersehbaren endwert da inkrementierungen verschiedener threads sich überlappen können import threading counter 0 def unsafe_increment global counter for _ in range 100_000 counter 1 read modify write not atomic threads threading thread target unsafe_increment for _ in range 5 for t in threads t start for t in threads t join counter is somewhere between 100000 and 500000 unpredictable print final counter counter kopieren lock ein threading lock stellt sicher dass nur ein thread den geschützten abschnitt gleichzeitig ausführt verwenden sie ihn als kontextmanager mit with damit der lock immer freigegeben wird auch wenn eine ausnahme ausgelöst wird import threading counter 0 lock threading lock def safe_increment global counter for _ in range 100_000 with lock acquire before read modify write counter 1 now only one thread at a time can run this threads threading thread target safe_increment for _ in range 5 for t in threads t start for t in threads t join print final counter counter always 500000 kopieren rlock re entranter lock wenn ein thread denselben lock zweimal erwerben muss z b ruft eine methode eine andere methode auf die ebenfalls den lock erwirbt verwenden sie threading rlock er erlaubt es demselben thread den lock erneut zu erwerben ohne einen deadlock zu verursachen import threading lock threading rlock def outer with lock print outer acquired inner inner also acquires the same lock def inner with lock works because rlock counts acquisitions print inner acquired t threading thread target outer t start t join outer acquired inner acquired kopieren threads koordinieren event und semaphore event threading event ist ein einfaches signal ein thread ruft set auf um zu signalisieren andere threads rufen wait auf um zu blockieren bis das signal eintrifft import threading import time ready threading event def worker print worker waiting for signal ready wait blocks here until ready set is called print worker signal received starting work t threading thread target worker t start time sleep 0 5 print main sending signal ready set t join worker waiting for signal main sending signal worker signal received starting work kopieren verwenden sie ein event um die startreihenfolge zu koordinieren beispielsweise um worker threads zu verzögern bis eine datenbankverbindung hergestellt wurde semaphore ein threading semaphore begrenzt die anzahl der threads die gleichzeitig einen abschnitt betreten können dies ist nützlich für die ratenbegrenzung des zugriffs auf eine gemeinsame ressource wie einen verbindungspool import threading import time allow at most 2 threads to enter the critical section at once semaphore threading semaphore 2 def use_connection name with semaphore print f name using connection time sleep 0 5 print f name releasing connection threads threading thread target use_connection args f t i for i in range 4 for t in threads t start for t in threads t join t0 using connection t1 using connection only 2 at a time t0 releasing connection t2 using connection t1 releasing connection t3 using connection t2 releasing connection t3 releasing connection kopieren thread lokale daten threading local erstellt ein objekt das pro thread separate werte hält dies ist nützlich für thread spezifische caches oder datenbank cursor import threading local_data threading local def set_user name local_data user name each thread writes its own copy print f threading current_thread name user local_data user threads threading thread target set_user args f user i name f thread i for i in range 3 for t in threads t start for t in threads t join thread 0 user user0 thread 1 user user1 thread 2 user user2 kopieren das lesen von local_data user in einem thread in dem es noch nie gesetzt wurde löst einen attributeerror aus genau wie jeder andere attributzugriff thread sichere queues die klasse queue queue aus dem standardbibliotheks modul queue nicht asyncio ist eine thread sichere fifo threads können elemente mit put und get einfügen und entnehmen ohne einen lock die gesamte synchronisierung wird intern gehandhabt das klassische muster ist producer consumer ein oder mehrere producer threads erzeugen arbeit consumer threads verarbeiten sie import threading import queue import time q queue queue maxsize 5 def producer for i in range 1 5 q put f item i print f produced item i time sleep 0 05 def consumer while true item q get if item is none sentinel stop when none is received break print f consumed item q task_done prod threading thread target producer cons threading thread target consumer cons start prod start prod join q put none signal consumer to stop cons join produced item 1 consumed item 1 produced item 2 consumed item 2 produced item 3 consumed item 3 produced item 4 consumed item 4 kopieren queue queue bietet auch task_done und join zum verfolgen wann alle in der warteschlange befindlichen elemente verarbeitet wurden sowie queue lifoqueue queue priorityqueue für alternative reihenfolgen threadpoolexecutor verwaltete thread pools das erstellen eines neuen thread objekts für jede aufgabe ist verschwenderisch wenn sie viele kurzlebige aufgaben haben concurrent futures threadpoolexecutor verwaltet einen pool wiederverwendbarer worker threads und gibt future objekte für jede übermittelte aufgabe zurück import concurrent futures import time def fetch_url url time sleep 0 5 simulate network i o return f response from url urls https api example com users https api example com posts https api example com comments with concurrent futures threadpoolexecutor max_workers 3 as executor submit all tasks and get future objects futures executor submit fetch_url url url for url in urls for future in concurrent futures as_completed futures url futures future print future result response from https api example com users order may vary response from https api example com comments response from https api example com posts kopieren executor map fn iterable ist eine kürzere form wenn sie keine einzelnen future objekte benötigen import concurrent futures import time def square n time sleep 0 01 return n n with concurrent futures threadpoolexecutor max_workers 4 as executor results list executor map square range 10 print results 0 1 4 9 16 25 36 49 64 81 kopieren executor map bewahrt die eingabereihenfolge in der ausgabe anders als as_completed das in der abschlussreihenfolge liefert das global interpreter lock gil cpython der standard python interpreter besitzt ein global interpreter lock einen mutex der nur einem thread erlaubt python bytecode gleichzeitig auszuführen das bedeutet dass threads in cpython keinen python code wirklich parallel auf mehreren cpu kernen ausführen können die praktische konsequenz i o gebundene aufgaben threads beschleunigen das programm tatsächlich während ein thread auf eine netzwerkantwort wartet wird der gil freigegeben und ein anderer thread läuft alle obigen beispiele demonstrieren dieses verhalten cpu gebundene aufgaben threads beschleunigen die ausführung nicht und können durch den overhead des kontextwechsels sogar leicht langsamer sein import threading import time def cpu_bound n total 0 for i in range n total i return total sequential start time perf_counter cpu_bound 5_000_000 cpu_bound 5_000_000 single time perf_counter start two threads gil prevents true parallelism start time perf_counter t1 threading thread target cpu_bound args 5_000_000 t2 threading thread target cpu_bound args 5_000_000 t1 start t2 start t1 join t2 join threaded time perf_counter start print f single threaded single 2f s print f two threads threaded 2f s two threads are not faster similar elapsed time kopieren für echte cpu parallelität in python verwenden sie stattdessen multiprocessing oder concurrent futures processpoolexecutor jeder prozess hat seinen eigenen gil threading vs asyncio sowohl threading als auch asyncio machen i o gebundene programme schneller aber sie funktionieren unterschiedlich threading asyncio nebenläufigkeitsmodell präemptiv das os wechselt threads kooperativ coroutinen geben bei await nach am besten für blockierende bibliotheken von drittanbietern bibliotheken mit async unterstützung aiohttp asyncpg gemeinsamer zustand erfordert explizite locks sicher innerhalb einer einzelnen event loop overhead ein os thread pro aufgabe sehr gering tausende von coroutinen auf einem thread lernkurve vertraut synchroner stil erfordert async await durchgehend faustregel wenn sie eine bibliothek verwenden die eine async kompatible version hat z b aiohttp statt requests greifen sie auf asyncio zurück wenn sie auf synchrone blocking bibliotheken angewiesen sind verwenden sie threading für cpu gebundene arbeit verwenden sie multiprocessing häufige fallstricke einen thread zweimal starten das aufrufen von start für dasselbe thread objekt mehr als einmal löst einen runtimeerror aus erstellen sie für jede ausführung eine neue thread instanz join vergessen ein thread der nicht gejoined wird kann noch laufen wenn das programm endet joinen sie immer threads deren abschluss wichtig ist oder machen sie sie zu daemons wenn sie wirklich fire and forget sind einen lock zu lange halten das sperren eines großen codeblocks macht den zweck der nebenläufigkeit zunichte halten sie gesperrte abschnitte so kurz wie möglich schützen sie nur die eigentliche lese modifiziere schreib operation deadlock ein deadlock tritt auf wenn zwei threads jeweils einen lock halten auf den der andere wartet verhindern sie dies indem sie mehrere locks immer in derselben reihenfolge in allen threads erwerben import threading...
|