在 concurrent.futures 个线程中使用 class 属性

Using class attribute in concurrent.futures threads

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

"First" 和 "second" 值必须始终等于 "init" 值,并且 "third" 和 "fourth" 必须相等.

此示例显示初始问题:

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

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

编辑: 我刚刚找到了一个新的方法来解决这个问题:使用 "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)