Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.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 即使其他线程未访问/写入每个变量,我是否应该使用锁来写入类变量(在线程期间)?_Python_Multithreading_Thread Safety_Locking_Python Multithreading - Fatal编程技术网

Python 即使其他线程未访问/写入每个变量,我是否应该使用锁来写入类变量(在线程期间)?

Python 即使其他线程未访问/写入每个变量,我是否应该使用锁来写入类变量(在线程期间)?,python,multithreading,thread-safety,locking,python-multithreading,Python,Multithreading,Thread Safety,Locking,Python Multithreading,我有一个类可以解析很多字符串。有6个线程正在写入6个主要变量。所有字符串的字符总数将超过500000个字符 每个线程都独立工作,即它们的所有字符串不会与其他字符串冲突或被其他字符串引用。这意味着所有线程在输入方面相互排斥,在输出时,它们只写入类中的变量 在写入这些变量期间,我应该在类中实现锁定机制吗 EDIT1:已完成线程。然而,为了比较执行速度,我也同时运行了所有程序。我发现按顺序运行时需要1.44秒,线程化时需要2.33秒。我做错了什么?如果每个线程访问的内存是独立的,则不需要任何同步。如果

我有一个类可以解析很多字符串。有6个线程正在写入6个主要变量。所有字符串的字符总数将超过500000个字符

每个线程都独立工作,即它们的所有字符串不会与其他字符串冲突或被其他字符串引用。这意味着所有线程在输入方面相互排斥,在输出时,它们只写入类中的变量

在写入这些变量期间,我应该在类中实现锁定机制吗


EDIT1:已完成线程。然而,为了比较执行速度,我也同时运行了所有程序。我发现按顺序运行时需要1.44秒,线程化时需要2.33秒。我做错了什么?

如果每个线程访问的内存是独立的,则不需要任何同步。如果计划以后从主线程访问这些结果,那么最后需要进行一些同步,但是等待工作线程完成应该足够了


这是一般的答案。Python的线程由于GIL而受到限制,因此您可能根本不需要任何东西。您也看不到预期的加速。

如果您的类级别变量要由所有线程更新,则需要使用类级别锁,如下所示

class Parser(object):
  sharedLock = threading.Lock()
  var1 = var2 = var3 = var4 = var5 = var6 = 0

  @classmethod
  def update(cls):
    with cls.sharedLock:
      # update your variables.

如果您想确保使用这些类属性的任何东西都不会使用过时数据,那么请使用锁,以便在更新之前无法读取这些数据。谢谢您的回复。我的类的变量由所有线程更新,但是独占的。也就是说,VarWrite1只能通过读取VarRead1由thread1写入,VarWrite2只能通过读取VarRead2由thread2写入。所以我还是应该使用锁吗?只要它们是独立的,就不需要锁。synchronizationlocks仅在两个线程访问共享变量时出现。Yup。根本没有加速。事实上,执行时间增加了大约0.9秒。你认为我应该做些什么来加速它?我预计在6个线程之间进行拆分时需要0.3-0.4秒,而不是1.44秒,线程之间的工作负载比较均匀