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

sti*_*per 20 python django

我找不到一个很好的方法来锁定Django中的一个关键部分.我可以使用锁或信号量,但python实现仅用于线程,因此如果生产服务器分叉那么那些将不会被尊重.有没有人知道一种方式(我现在正在考虑posix信号量)以保证跨进程的锁定,或禁止这种方式阻止Django服务器分叉.

tak*_*mag 16

如果使用RDBMS,则可以使用其"LOCK"机制.例如,当一个"SELECT FOR UPDATE"事务锁定一行时,与该行的另一个"SELECT FOR UPDATE"事务必须等待.

# 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;
Run Code Online (Sandbox Code Playgroud)

  • 这非常酷,它可以在分布式系统中运行.干得好. (4认同)
  • Django对此有本机支持.请参见http://stackoverflow.com/a/33480015/78234 (3认同)

Tal*_*iss 13

使用Django内置的select_for_update函数.
https://docs.djangoproject.com/en/1.8/ref/models/querysets/#select-for-update
来自docs:
返回一个查询集,它将锁定行直到事务结束,生成SELECT ... FOR支持数据库上的UP语句SQL语句.

例如:

entries = Entry.objects.select_for_update().filter(author=request.user)
Run Code Online (Sandbox Code Playgroud)

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


Dus*_*tin 9

在您的应用突然需要在多个服务上运行时,您需要一个分布式锁管理器.我为此目的写了一个elock.有更大的,其他人选择忽略每个建议,并使用memcached完成相同的操作.

请不要将memcached用于轻量级咨询锁定.它旨在忘记一些东西.

我喜欢在我制作网络应用程序时假装文件系统不存在.使规模更好.

  • 你的坏屁股Erlang写的,干净的代码看,测试用例,分布式文件柜比我简单的非分布式锁更好,所以它应该是已知的,所以它应该写.但有一件事,你有任何使用示例(非设置)吗? (6认同)

Vin*_*jip 5

你可以使用简单的文件锁定为互斥机制,看我的食谱在这里.它不适合所有场景,但是你没有说明为什么要使用这种类型的锁定.