Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何锁定Django中的关键部分?_Python_Django - Fatal编程技术网

Python 如何锁定Django中的关键部分?

Python 如何锁定Django中的关键部分?,python,django,Python,Django,在Django中,我找不到一个好的干净方法来锁定关键部分。我可以使用锁或信号量,但python实现仅用于线程,因此,如果生产服务器分叉,则不会考虑这些。有人知道一种方法(我现在想是posix信号量)来保证进程间的锁定,或者阻止Django服务器分叉的方法。您可以使用简单的文件锁定作为互斥机制,请参阅我的方法。它不适合所有情况,但是您没有说太多关于为什么要使用这种类型的锁定。我最终提出了一个涉及文件锁定的解决方案。如果这里有人最终使用它,请记住,建议锁和NFS不能很好地混合,所以请将其保留在本地。

在Django中,我找不到一个好的干净方法来锁定关键部分。我可以使用锁或信号量,但python实现仅用于线程,因此,如果生产服务器分叉,则不会考虑这些。有人知道一种方法(我现在想是posix信号量)来保证进程间的锁定,或者阻止Django服务器分叉的方法。

您可以使用简单的文件锁定作为互斥机制,请参阅我的方法。它不适合所有情况,但是您没有说太多关于为什么要使用这种类型的锁定。

我最终提出了一个涉及文件锁定的解决方案。如果这里有人最终使用它,请记住,建议锁和NFS不能很好地混合,所以请将其保留在本地。此外,这是一个阻塞锁,如果您想搞乱循环并不断地检查,那么代码中就有指令

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()

当你的应用突然需要在多个服务上运行时,你需要一个分布式锁管理器。我就是为了这个目的而写的。有人和其他人选择忽略每一个建议,对memcached也这样做

请不要将memcached用于光警告锁定以外的任何用途。它被设计用来忘记东西


我喜欢在制作web应用程序时假装文件系统不存在。使伸缩性更好。

如果使用RDBMS,可以使用其“锁定”机制。 例如,当一个“选择更新”事务锁定一行时,另一个带有该行的“选择更新”事务必须等待

# 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;

我没有写这篇文章,但我发现面对同样的问题,这篇文章非常有用:


基本上,您可以使用Redis服务器创建一个中央服务器,以公开锁定功能

使用Django内置的选择更新功能。

从文档中:
返回一个查询集,该查询集将锁定行直到事务结束,并生成一个SELECT。。。用于支持的数据库上的UPDATE SQL语句

例如:

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

所有匹配的条目都将被锁定,直到事务块结束,这意味着其他事务将被阻止更改或获取对它们的锁定。

我正在设置虚拟服务器。我不想对它进行排队,因为我希望通过DJango公开的xml rpc接口返回系统是否有空间容纳新的虚拟服务器。使用该接口的人可以快速循环并点亮10台服务器,因此需要将供应算法锁定为关键部分,以便在这种情况下我不会出错。然后,只要请求者不介意锁定并重试,就应该可以使用文件锁定方法。你的坏家伙Erlang写道,干净的代码外观,测试用例,分布式文件锁显然比我简单的非分布式锁更好,所以它应该被知道,也应该被编写。不过有一件事,你有没有关于它的用法(非设置)的例子?谢谢你的评论。:)到目前为止,我写的唯一文档都是从项目页面链接的。现在我猜这个东西基本上是HTTP(我看到200409),对吗?我也可以更改服务器绑定的post吗?http语义在这里不起作用,但始终可以更改端口号。:)这真的很酷,它可以在分布式系统中工作。干得好。这正是天才的定义。Django对此有自己的支持。请注意,许多DBs还支持不依赖于行的锁,因此这在一般情况下也适用。在postgreSQL中,他们称之为顾问锁;印刷品(“收购1”);lock.acquire()打印(“已获取2”)打印:已获取1已获取2。。。它不会阻止第二次尝试。请记住,select\U for\U update代码块必须包含在事务中。