python - 在并发线程中使用类属性

标签 python multithreading oop attributes concurrent.futures

如何在调用其他方法的线程中使用某些类属性,而不编辑初始值,也不将属性作为参数传递?

“第一个”和“第二个”值必须始终等于“init”值,并且“第三个”和“第四个”必须都相等。

此示例显示了最初的问题:

from concurrent.futures import ThreadPoolExecutor
from random import random
from time import sleep

class main():
    def __init__(self):
        self.var = random()
        print('init', self.var)

    def first(self):
        print('first', self.var)
        self.second()
        print('fourth', self.var)

    def second(self):
        print('second', self.var)
        self.var = random()
        print('third', self.var)
        sleep(1)

m = main()
with ThreadPoolExecutor() as executor:
    executor.submit(m.first)
    executor.submit(m.first)
    executor.submit(m.first)

在方法中将 self.var 分配给另一个属性显然不起作用:

class main():
    def __init__(self):
         self.var = random()
         print('init', self.var)

    def first(self):
         self.var2 = self.var
         print('first', self.var2)
         self.second()
         print('fourth', self.var2)

    def second(self):
        print('second', self.var2)
        self.var2 = random()
        print('third', self.var2)
        sleep(1)

我尝试的唯一解决方案是将属性分配给局部变量并将其作为参数传递给被调用的函数。就我而言,这不是一个好的解决方案,因为我需要传递大量属性,并且代码会快速增加并开始变得不那么可读。

class main():
    def __init__(self):
        self.var = random()
        print('init', self.var)

    def first(self):
        var = self.var
        print('first', var)
        var = self.second(var)
        print('fourth', var)

    def second(self, par):
        print('second', par)
        par = random()
        print('third', par)
        sleep(1)
        return par

你能想出一种Python式的方法来使用属性而不是作为参数传递的局部变量吗?

编辑: 我刚刚找到了一种解决问题的新方法:使用“nonlocal”语句并嵌套函数,您对此有何看法?

class main():
def __init__(self):
    self.var = random()
    print('init', self.var)

def first(self):
    var = self.var
    print('first', var)

    def second():
        nonlocal var
        print('second', var)
        var = random()
        print('third', var)
        sleep(1)

    second()
    print('fourth', var)

最佳答案

如果您只想为每个线程拥有单独的状态,您可以创建不同的对象并将其传递到每个线程中:

from concurrent.futures import ThreadPoolExecutor
from random import random
from time import sleep

class main():
    def __init__(self):
        self.var = random()
        print('init', self.var)

    def first(self):
        print('first', self.var)
        self.second()
        print('fourth', self.var)

    def second(self):
        print('second', self.var)
        self.var = random()
        print('third', self.var)
        sleep(1)

def worker():
    m = main()
    m.first()

with ThreadPoolExecutor() as executor:
    executor.submit(worker)
    executor.submit(worker)
    executor.submit(worker)

关于python - 在并发线程中使用类属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46993312/

相关文章:

java - Java 8 流是原子的吗?

c++ - 如何将参数传递给使用模板的类

java - 多线程:操纵同一对象的不同字段的线程

python - 看门狗兼容性 : A workaround for "CancelIoEx"

c++ - 如何从 QDialog 传递数据?

matlab - 从子类更改父类(super class)的属性

python - Sklearn OneClassSVM 与 RandomizedSearchCV : "ValueError: ' f' is not in list"

python - 我怎样才能结合这两个正则表达式?

python - 使用 lxml,找到所有 td 类 ='banana',但前提是它们包含文本 "Today"

python - 如何在Scrapy中更新DjangoItem