我正在尝试实施一个小花园的例子。
花园是一个具有math.e**x
x**-3
功能的类,它每秒检查供水量。当水量超过某个阈值时,花园会产生一些花朵。
这是我的第一次尝试:
花园课
grow()
main.py
import time
class Garden:
def __init__(self):
self.water = 0
print("Garden built!")
def grow(self):
while self.water < 50:
print("Water supplied: {0}".format(self.water))
time.sleep(1)
print("Produced 5 flowers!")
当我运行import time
from garden import Garden
from threading import Thread
from queue import Queue
def main():
que = Queue()
garden = Garden()
thr = Thread(target=garden.grow).start()
que_garden = que.get()
water(que_garden, 20)
time.sleep(5)
water(que_garden, 30)
thr.join()
def water(garden, amount):
garden.water += amount
print("Watered with {0}!".format(amount))
时,我得到以下输入:
main.py
因此,Garden built!
Water supplied: 0
Water supplied: 0
Water supplied: 0
Water supplied: 0
Water supplied: 0
会不断被调用,永远不会进入grow()
行。我预计一旦water(que_garden, 20)
被调用,它就会被锁定,直到thr = Thread(target=garden.grow).start()
完成但继续到下一行。我在这里缺少什么?
答案 0 :(得分:1)
我认为您需要garden.grow
而不是garden.grow()
。目标参数是可调用。您正在调用grow
方法并传递其返回值。
答案 1 :(得分:1)
此:
que_garden = que.get()
阻塞,直到队列中有东西。但是在任何地方都没有que_garden.put()
。
这没有队列:
import time
from garden import Garden
from threading import Thread
def main():
garden = Garden()
thr = Thread(target=garden.grow)
thr.start()
water(garden, 20)
time.sleep(5)
water(garden, 30)
time.sleep(5)
water(garden, 10)
thr.join()
def water(garden, amount):
garden.water += amount
print("Watered with {0}!".format(amount))
main()
输出:
Garden built!
Water supplied: 0
Watered with 20!
Water supplied: 20
Water supplied: 20
Water supplied: 20
Water supplied: 20
Watered with 30!
Produced 5 flowers!
Watered with 10!
答案 2 :(得分:0)
来自Python文档:
class threading.Thread(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)
应始终调用此构造函数 用关键字参数。参数是:组应为None;为ThreadGroup的未来扩展保留 上课已经实施。
target是run()方法调用的可调用对象。 默认为None,表示不调用任何内容。
所以,改变:
thr = Thread(target=garden.grow()).start()
到
thr = Thread(target=garden.grow).start()