2014-12-17 4 views
6

Ich versuche Asyncio und muss es mit einigen normalen Multi-Threaded Blocking-Code mischen, also muss ich die Ausführung mit run_in_exector entladen.Ist asyncios loop.run_in_executor Thread-sicher?

Die asyncio docs warn that "most functions" aren't threadsafe und call_soon_threadsafe ist die einzige Thread-sichere Funktion. Es gibt ein paar andere, wie zum Beispiel Future.add_done_callback, die explizit als threadsicher dokumentiert sind. Es hat dann einen Satz, der später sagt: "Sie können run_in_executor verwenden, um Callbacks in anderen Threads auszuführen", aber nicht die Thread-Sicherheit davon spezifisch kommentieren.

run_in_executor ist nicht threadsicher, aber wenn man sich die Quelle anschaut, sieht es so aus, als wäre sie threadsicher, wenn die richtigen Codepfade genommen werden.

Weiß jemand, ob es ist angeblich Thread sicher sein, aber nur nicht dokumentiert, um so zu sein?

+0

Was meinen Sie in diesem Zusammenhang von "thread-safe" zu machen? Die Dokumentation verwendet diesen Begriff, um anzuzeigen, ob es sicher ist, eine bestimmte Methode von einem Thread außerhalb desjenigen aufzurufen, der die Ereignisschleife 'asyncio' ausführt. Das ist wahrscheinlich nicht das, was du hier fragst, oder? – dano

+0

Das ist genau das, was ich meinte. Ich habe einige multi-threaded Code und versuche, asyncio damit zu verwenden, also brauche ich eine thread-sichere Möglichkeit, Blockierungscode zu planen. –

Antwort

4

run_in_executor soll nicht von Spezifikation (in PEP-3156 geklärt werden, sorry, es sieht aus wie implizite Aussage und wahrscheinlich sollte) thread sein.

Auch wenn die konkrete Implementierung Thread-sicher ist, gehen Sie bitte nicht davon aus, dass eine PEP-3156-konforme Implementierung auch Thread-sicher ist.

+2

Der richtige Weg, um es (oder irgendwas) Thread-Thread sicher zu machen, ist, es in call_soon_threadsafe: 'loop.call_soon_threadsafe (loop.run_in_executor, executor, callback, * args))' ' – Lucretiel

2

Ich denke, es hängt ganz davon ab, was Sie es geben. Es startet effektiv nur einen Thread und führt Ihren Code aus, also ob das threadsicher ist oder nicht, hängt davon ab, was Sie ihm sagen.

2

Die Standardimplementierung scheint Thread-sicher zu sein, wenn der Executor-Parameter nicht None ist oder der Standard-Executor bereits festgelegt ist (call loop.set_default_executor()). Andernfalls können zwei Executor erstellt werden.

Sie können einen Patch schreiben die Methode Thread-sicher ;-)