【问题标题】:Using class attribute in concurrent.futures threads在 concurrent.futures 线程中使用类属性
【发布时间】:2017-10-28 18:54:04
【问题描述】:

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

“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)

【问题讨论】:

    标签: python multithreading oop attributes concurrent.futures


    【解决方案1】:

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

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-02
      • 1970-01-01
      • 1970-01-01
      • 2016-11-25
      相关资源
      最近更新 更多