首页 > 解决方案 > Python中的多线程问题 - 我怎样才能使它正常工作?

问题描述

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)

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

标签: python-3.xmultithreadingqueue

解决方案


您最好创建一个工作函数,而不是尝试使用lambda. 如果我理解正确,您总共需要四个线程。相反,您可以让每个线程只计算两次输出。当您有四个线程时,您的代码将变为以下内容。

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)

如前所述,另一个选项是让每个线程执行两次逻辑,如下所示。

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)

推荐阅读