2009-07-12 16 views
3

In Python mit all dieser Idee von "Alles ist ein Objekt" wo ist Thread-Sicherheit?Statische Methoden und Fadensicherheit

Ich entwickle django Website mit wsgi. Außerdem würde es in Linux funktionieren, und da ich weiß, dass sie effektives Prozessmanagement verwenden, konnten wir nicht viel über Thread-Sicherheit nachdenken. Ich zweifle nicht daran, wie Module geladen werden, und ihre Funktionen sind statisch oder nicht? Jede Information wäre hilfreich.

Antwort

8

Funktionen in einem Modul entsprechen statischen Methoden in einer Klasse. Das Problem der Threadsicherheit tritt auf, wenn mehrere Threads gemeinsam genutzte Daten ändern, oder sogar ein Thread diese Daten ändert, während andere sie lesen. Man vermeidet es am besten, indem man die Daten einem ONE-Modul zuweist (über Queue.Queue von anderen zugreifbar), aber wenn das nicht machbar ist, muss man auf Sperren und andere, komplexere Synchronisations-Primitive zurückgreifen.

Dies gilt unabhängig davon, ob der Zugriff auf gemeinsam genutzte Daten in Modulfunktionen, statischen Methoden oder Instanzmethoden erfolgt. Die gemeinsam genutzten Daten sind Instanzvariablen, Klassenvariablen oder globale Variablen (Scoping und Thread-Sicherheit sind im Wesentlichen disjunkt) Abgesehen davon, dass funktionslokale Daten intrinsisch threadsicher sind - kein anderer Thread wird jemals die Daten in einer Funktionsinstanz sehen, solange und solange die Funktion sie nicht über gemeinsame Container "freigibt".

Wenn Sie das Modul multiprocessing in Pythons Standardbibliothek anstelle des Moduls threading verwenden, müssen Sie sich möglicherweise nicht um die "Thread-Sicherheit" kümmern - im Wesentlichen, weil KEINE Daten zwischen Prozessen ausgetauscht werden ... Sie gehen aus dem Weg, um das zu ändern, z über mmap ped-Dateien ;-).

0

Sehen Sie die python documentation, um die allgemeinen Auswirkungen von Python auf die Threadsicherheit besser zu verstehen.

Django scheint sich thread safe wie von 1.0.3 zu sein, aber Ihr Code nicht und Sie werden zu überprüfen, ob haben ...

Mein Rat wäre, einfach zu, dass es egal, und servieren Sie Ihren Anwendung mit mehreren Prozessen anstelle von mehreren Threads (zum Beispiel mit Apache 'Prefork' statt 'Worker' MPM).

+1

Sie müssen Prefork MPM nicht verwenden. Sie könnten den mod_wsgi-Daemon-Modus verwenden. In diesem Fall können Sie immer noch workers MPM verwenden, da die Anzahl der vom mod_wsgi-Daemon-Modus verwendeten Threads separat gesteuert wird. Die Verwendung von prefork wäre nur für mod_python oder den eingebetteten Modus von mod_wsgi erforderlich. –