2010-03-28 39 views
4

有没有什么方法可以阻止像Django中同步的Java这样的关键区域?Django中的线程同步

+1

在很多情况下,像Java的'synchronized'这样的东西对于Django代码来说不够好。 Django应用程序中的常见场景不是仅仅保护*其他线程的资源*,而是来自*尝试使用资源*的任何代码。在许多情况下,WSGI服务器将使用多个*进程*来为请求提供服务,因此您不仅需要防止单个进程中的其他线程访问资源,还要阻止所有可能尝试访问它的进程。 'synchronized'对于这个并不够好,而一个复制'synchronized'的Python解决方案也不够好。 – Louis 2015-05-11 14:39:09

回答

5

您可以使用锁来确保一次只有一个线程将访问某个代码块。

为此,您只需创建一个Lock对象,然后在想要同步的代码块之前获取该锁。举例:

lock = Lock() 

lock.acquire() # will block if another thread has lock 
try: 
    ... use lock 
finally: 
    lock.release() 

欲了解更多信息,请参阅http://effbot.org/zone/thread-synchronization.htm

+0

正如路易斯在这个问题上评论的那样,这只会在单个服务器进程时才起作用,通常情况并非如此。 – RexE 2017-09-13 04:56:11

0

大文章贾斯汀,使用Python 2.5的只有一件事,使这种方式更容易

在Python 2.5和更高版本,你也可以使用with语句。从未来进口

with_statement#2.5只

与锁: ...访问时用锁使用时,该语句将自动离开块时进入块之前获得锁,并释放共享资源