2013-02-20 5 views
5

Ich habe gerade nach dieser neuen Implementierung gesucht, und ich benutze Python 2.7, ich muss this installieren, also wenn ich es benutze, werde ich das Wort GIL auf CPython vergessen?Ist gleichzeitig ein Medikament der GIL?

+1

http://www.dalkescientific.com/writings/diary/archive/2012/01/19/concurrent.futures.html –

+1

http://docs.python.org/dev/library/concurrent.futures.html # module-concurrent.futures - Erwähnt nichts über die GIL, also sind die verwendeten Threads offensichtlich echte Threads. Warum sollte man sich sonst mit diesem ganzen Hulabaloo beschäftigen? –

+0

Ich habe festgestellt, dass asynchroner Code liebt die Verwendung von concurrent.Futures, so sagte ich, dass es eine Medizin für GIL –

Antwort

12

Nein, concurrent.futures hat fast nichts mit der GIL zu tun.

Die Verwendung von Prozessen anstelle von Fäden ist Medizin für die GIL. (Natürlich wie alle Medizin, es hat Nebenwirkungen. Aber es funktioniert.)

Das futures Modul gibt Ihnen nur eine einfachere Art und Weise und auf Aufgaben warten zu planen als threading oder multiprocessing direkt verwenden. Und es hat den zusätzlichen Vorteil, dass Sie zwischen einem Thread-Pool und einem Prozesspool (und vielleicht sogar einer Greenlet-Schleife oder etwas verrücktem, das Sie erfinden und bauen) wechseln können, ohne den Code future zu ändern. Also, wenn Sie nicht wissen, ob Ihr Code GIL-Probleme haben wird, können Sie es erstellen, um Threads zu verwenden, und es dann zu verwenden, um Prozesse mit einer einzeiligen Änderung zu verwenden, was ziemlich nett ist.

Aber, wenn Sie die ThreadPoolExecutor verwenden, wird es genau die gleichen GIL Probleme haben, als ob Sie einen Thread-Pool erstellt, Task-Queue usw. manuell mit threading und queue. Wenn Sie die ProcessPoolExecutor verwenden, werden die GIL-Probleme auf die gleiche Weise (und mit den gleichen Kompromissen) vermieden, als ob Sie multiprocessing manuell verwendet hätten.

Und das PyPI-Paket ist nur ein einfacher Backport des concurrent.futures-Moduls von 3.2 zu 2.x (und 3.0-3.1). (Es ist kein Wundermittel gibt Ihnen den neuen-und-Art-of-verbesserten 3,2 GIL, oder mehr verbesserte 3,3 GIL, viel weniger den GIL entfernen.)


Ich soll wahrscheinlich nicht einmal Ich habe erwähnt, dass sich die GIL-Änderungen geändert haben, denn dies scheint nur Verwirrung verursacht zu haben ... aber jetzt, lasst mich versuchen, es durch eine zu starke Vereinfachung zu glätten.

Wenn Sie nichts als IO-gebundene Arbeit haben, sind Threads eine gute Möglichkeit, Parallelität zu erhalten, bis zu einem vernünftigen Limit. Und 3.3 macht sie noch besser - aber in den meisten Fällen ist 2.7 bereits gut genug, und in den meisten Fällen, in denen es nicht 3.3 ist, ist es immer noch nicht gut genug. Wenn Sie 10000 gleichzeitige Clients verwalten möchten, sollten Sie anstelle von Threads eine Ereignisschleife (z. B. twisted, tornado, gevent, tulip usw.) verwenden.

Wenn Sie eine CPU-gebundene Arbeit haben, helfen Threads nicht, diese Arbeit zu parallelisieren. In der Tat machen sie die Dinge noch schlimmer. 3.3 macht diese Strafe nicht ganz so schlimm, aber es ist immer noch eine Strafe, und das sollte man immer noch nicht tun. Wenn Sie die CPU-Arbeit parallelisieren möchten, müssen Sie Prozesse, nicht Threads verwenden. Der einzige Vorteil von 3.3 ist, dass futures ein wenig einfacher zu verwenden ist als multiprocessing und kommt eingebaut, anstatt es zu installieren.

Ich möchte Sie nicht davon abhalten, zu 3.3 zu wechseln, weil es eine bessere Implementierung einer besseren Sprache als 2.7 ist. Aber bessere Parallelität ist kein Grund, sich zu bewegen.

+0

Das sind also verschiedene Dinge! es war, dass GIL 3.2 neu geschrieben wurde, dass ich scheint, dass es concurrent.futures ist, die das Problem lösen, danke :) –

+2

@AbdelouahabPp: Nein, 'concurrent.futures' löst _not_ kein Problem, außer dem Problem zu machen gleichzeitiger Code etwas einfacher zu schreiben. Die Änderungen der GIL in 3.2 und 3.3 sind völlig unabhängig, und es ist nur ein Zufall, dass die erste signifikante GIL-Änderung in mehr als einem Jahrzehnt in der gleichen Version von Python wie die "Futures" -Bibliothek angekommen ist. – abarnert

+0

also sollte ich dann zu 3.3 wechseln, wenn ich exzellenten gleichzeitigen Code bekommen möchte! Vielen Dank :) und es tut mir leid, weil dieser Thread ich für mehrere Male zurück, um mehr die Idee zu bekommen, bin ein Anfänger, und fand diese Bibliothek mit Tornado –

Verwandte Themen