python-3.x - 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 个结果。
解决方案
您最好创建一个工作函数,而不是尝试使用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)
推荐阅读
- java - (Java) 如何在不按“回车”键的情况下获取用户输入
- python - Numpy:沿轴应用具有不同索引的输入数组
- javascript - 将文本从 html 附加到不同的部分
- asp.net - 使用 Newtonsoft Jschema,如何验证基于抽象类的派生类属性?
- sql-server - 在数据库中搜索具有特定值的所有列名
- c# - 如何绕过明确设置外键属性
- java - Java如何格式化日期以在弹性搜索中插入
- python - 字符串内的 JSON 的 Argparse
- javascript - 如何使用一个 L.Shapefile/zip 文件对象但更改每一层的 onEachFeature?
- android - 三星 8+ 没有收到任何活动识别事件