python锁方法注释

python锁方法注释,python,locking,annotations,Python,Locking,Annotations,是否有python锁注释对python方法的效果与java方法的“synchronized”关键字相同?我可以假设python中不存在内置功能,但您可以通过链接了解它在java中的工作方式来实现它: 创建的每个Java对象,包括 加载的每个类都有一个关联的 锁定或监视。将代码放入 同步块使编译器 附加指令以获取 之前锁定指定的对象 执行代码,然后释放它 之后(或者是因为代码 正常完成或不正常完成)。 在获取锁和 释放它,一个线程被称为 “拥有”锁。在螺纹点处 A想要获得锁,如果 线程B已经拥有了

是否有python锁注释对python方法的效果与java方法的“synchronized”关键字相同?

我可以假设python中不存在内置功能,但您可以通过链接了解它在java中的工作方式来实现它:

创建的每个Java对象,包括 加载的每个类都有一个关联的 锁定或监视。将代码放入 同步块使编译器 附加指令以获取 之前锁定指定的对象 执行代码,然后释放它 之后(或者是因为代码 正常完成或不正常完成)。 在获取锁和 释放它,一个线程被称为 “拥有”锁。在螺纹点处 A想要获得锁,如果 线程B已经拥有了它,那么 线程A必须等待线程B启动 放开它

所以,也许像这样的方法可以奏效:

java中的同步语句:

public class Java {
    static private int count = 0;

    public void increment() {
       synchronized (this) {
          count++;
       }
    }
}
成为:

import threading

class Java:
   cout = 0
   lock = threading.RLock()

   def increment():
       with Java.lock:
           Java.cout += 1
Java中的同步方法:

public class Java {
    static private int count = 0;

    public synchronized void increment() {
        count ++;
    }
}
成为:

import threading

def synchronized(method):
    """ Work with instance method only !!! """

    def new_method(self, *arg, **kws):
        with self.lock:
            return method(self, *arg, **kws)


    return new_method

class Java:
    count = 0
    lock = threading.RLock()

    @synchronized
    def incremenet(self):
        Java.count += 1
显式比隐式好

注:我在Java方面的知识非常有限,这是我关于Java特性的第一堂课,所以可能我错过了一些东西(或者可能我错过了这里的所有要点:),我们希望这个答案能帮助一些人


注意:我创建的锁是一个类变量,因此线程同步发生在类级别,如果我们想在实例级别(仅)进行同步,我认为java是如何进行同步的,上面的代码必须更改。

我有时使用这样的装饰器:

def synchronized(f):
    @functools.wraps(f)
    def wrapper(self, *args, **kwargs):
        try:
            _ = self._lock
        except AttributeError:
            self._lock = threading.Lock()

        with self._lock:
            return f(self, *args, **kwargs)
    return wrapper

但是,这个解决方案在第一次调用修饰的方法时有一个竞争条件。避免此问题的最简单方法是在没有其他线程首先运行时调用一个同步方法,或者在
中手动分配
self.\u lock

谢谢您的评论,您能更精确一点吗?这取决于您在做什么。Python有一个“全局解释器锁”,因此一次只能有一个线程执行Python代码,并且不能利用多个内核。但是,如果您的代码正在等待磁盘访问、网络数据或numpy计算,那么多线程是有效的。Xavier,不要胡说八道。多线程并不总是一个坏主意。假设它在多核系统上的GIL存在一些CPU限制代码的问题。。。但这还不足以称整个事情为“坏主意”。@Corey引用guido的话说,不幸的是,对于大多数凡人来说,线程编程太难了。。。。在中找到,您还可以使用带有lock:
,而不是acquire和release方法。您可能希望在装饰器中添加一个
return
:您的示例不需要它,但它允许您使用返回某些内容的方法重用装饰器。此外,也没有特别的理由通过类显式访问锁,只要您不为其赋值,就可以通过实例访问类变量
with self.lock:return method(self,*args,**kws)
@Duncan:谢谢你的评论:)更新了,现在我对我自己很生气,我怎么会错过我认为同步装饰器应该自己创建锁并存储它装饰的函数。decorator与类完全分离,而且您还可以在函数上使用它。@singularity:是的,您是对的。我想可能太多了。