Python 3.x Python中的多线程问题-如何使其正常工作?

Python 3.x Python中的多线程问题-如何使其正常工作?,python-3.x,multithreading,queue,Python 3.x,Multithreading,Queue,你好!!我的程序必须计算一个立方体的体积和总长度,并将所有这些数据打印到线程中。线程没有启动…我应该修改什么?它必须返回4个结果。您最好创建一个辅助函数,而不是尝试使用lambda封装该逻辑。如果我理解正确,您总共需要四个线程。相反,您可以让每个线程只计算两次输出。当您有四个线程时,代码如下所示 import queue import threading class Cube(): def __init__(self, lat): self.lat = lat def vo

你好!!我的程序必须计算一个立方体的体积和总长度,并将所有这些数据打印到线程中。线程没有启动…我应该修改什么?它必须返回4个结果。

您最好创建一个辅助函数,而不是尝试使用
lambda
封装该逻辑。如果我理解正确,您总共需要四个线程。相反,您可以让每个线程只计算两次输出。当您有四个线程时,代码如下所示

import queue
import threading

class Cube():
def __init__(self, lat):
    self.lat = lat
    

def volume(self):
    return self.lat ** 3
    

def lenght(self):
    return self.lat * 12


if __name__ == "__main__":
que = queue.Queue()
cube = Cube(2)
t1 = threading.Thread(target=lambda c, q: q.put(c.lenght()), args=(cube, que))
t2 = threading.Thread(target=lambda c, q: q.put(c.volume()), args=(cube, que))
t1.start()
t2.start()
t1.join()
t2.join()
while not que.empty():
    result = que.get()
    
    print(result)
前面提到的另一个选项是让每个线程执行两次逻辑,如下所示

import queue
import threading

NUM_ITERS = 2


class Cube():
    def __init__(self, lat):
        self.lat = lat
        
    def volume(self):
        return self.lat ** 3
        
    def length(self):
        return self.lat * 12


def worker(cube, q, attr):
    func = getattr(cube, attr)
    val = func()
    q.put(val)


if __name__ == "__main__":
    que = queue.Queue()
    cube = Cube(2)
    threads = []
    for _ in range(NUM_ITERS):
        for attr in ("length", "volume"):
            thread = threading.Thread(target=worker, args=(cube, que, attr))
            threads.append(thread)

    for thread in threads:
        thread.start()

    while not que.empty():
        result = que.get()
        
        print(result)

你是说两个结果?另外,如果您正确缩进每个对象,代码也可以工作。我需要启动2个线程并按一定顺序执行方法。因此,每个线程都需要计算长度和体积?一个线程代表体积,一个线程代表长度。每个线程必须启动两次。不明白为什么,但我必须这样做。。。
import queue
import threading

NUM_ITERS = 2


class Cube():
    def __init__(self, lat):
        self.lat = lat
        
    def volume(self):
        return self.lat ** 3
        
    def length(self):
        return self.lat * 12


def worker(cube, q, attr):
    for num in range(NUM_ITERS):
        func = getattr(cube, attr)
        val = func()
        q.put(val)


if __name__ == "__main__":
    que = queue.Queue()
    cube = Cube(2)
    t1 = threading.Thread(target=worker, args=(cube, que, "length"))
    t2 = threading.Thread(target=worker, args=(cube, que, "volume"))
    t1.start()
    t2.start()
    t1.join()
    t2.join()
    while not que.empty():
        result = que.get()
        
        print(result)