tutorial pelicula descargar python django

python - pelicula - django windows



¿Cómo bloquear una sección crítica en Django? (6)

No puedo encontrar una buena manera limpia de bloquear una sección crítica en Django. Podría usar un bloqueo o un semáforo, pero la implementación de Python es solo para subprocesos, por lo que si el servidor de producción se divide, entonces no se respetarán. ¿Alguien sabe de alguna manera (en este momento estoy pensando en los semáforos de posix) para garantizar un bloqueo en todos los procesos, o prohibir que una forma de impedir que un servidor Django se bifurque?


Necesita un administrador de bloqueo distribuido en el punto en el que su aplicación de repente necesita ejecutar más de un servicio. Escribí elock para este propósito. Hay otros más grandes y otros han optado por ignorar cada sugerencia y han hecho lo mismo con memcached.

Por favor, no use memcached para nada más que un ligero bloqueo de advertencia. Está diseñado para olvidar cosas.

Me gusta fingir que los sistemas de archivos no existen cuando estoy creando aplicaciones web. Hace escala mejor.



Podría usar el bloqueo simple de archivos como un mecanismo de exclusión mutua, vea mi receta here . No se ajustará a todos los escenarios, pero entonces no ha dicho mucho sobre por qué quiere usar este tipo de bloqueo.


Si usa RDBMS, puede usar su mecanismo de "BLOQUEO". Por ejemplo, mientras una transacción "SELECCIONAR PARA ACTUALIZACIÓN" bloquea una fila, la otra transacción "SELECCIONAR PARA ACTUALIZACIÓN" con la fila debe esperar.

# You can use any Python DB API. [SQL] BEGIN; [SQL] SELECT col_name FROM table_name where id = 1 FOR UPDATE; [Process some python code] [SQL] COMMIT;


Terminé yendo con una solución que hice con el bloqueo de archivos. Si alguien aquí termina usándolo, recuerde que los bloqueos de advertencia y NFS no se combinan bien, así que manténgalos en un lugar local. Además, este es un bloqueo de bloqueo, si desea perder tiempo con los bucles y verificar constantemente, entonces hay instrucciones en el código.

import os import fcntl class DjangoLock: def __init__(self, filename): self.filename = filename # This will create it if it does not exist already self.handle = open(filename, ''w'') # flock() is a blocking call unless it is bitwise ORed with LOCK_NB to avoid blocking # on lock acquisition. This blocking is what I use to provide atomicity across forked # Django processes since native python locks and semaphores only work at the thread level def acquire(self): fcntl.flock(self.handle, fcntl.LOCK_EX) def release(self): fcntl.flock(self.handle, fcntl.LOCK_UN) def __del__(self): self.handle.close() Usage: lock = DJangoLock(''/tmp/djangolock.tmp'') lock.acquire() try: pass finally: lock.release()


Utilice la función select_for_update incorporada de Django.
https://docs.djangoproject.com/en/1.8/ref/models/querysets/#select-for-update
De los documentos:
Devuelve un queryset que bloqueará las filas hasta el final de la transacción, generando una instrucción SELECT ... FOR UPDATE SQL en las bases de datos compatibles.

Por ejemplo:

entries = Entry.objects.select_for_update().filter(author=request.user)

Todas las entradas coincidentes se bloquearán hasta el final del bloque de transacción, lo que significa que se evitará que otras transacciones cambien o adquieran bloqueos en ellas.