如何在 python 中的线程中增加 class 字段?
How to increment class field within a Thread in python?
我正在尝试实现一个小花园示例。
Garden 是一个具有 grow()
功能的 class,它每秒检查供水量。当水量超过某个阈值时,花园会开出几朵花。
这是我的第一次尝试:
花园class
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!")
main.py
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()
被调用它不会被锁定,直到 grow()
完成但继续到下一行。我在这里错过了什么?
我认为您想要 garden.grow
而不是 garden.grow()
。目标参数是一个 callable。您正在调用 grow
方法并传递其 return 值。
来自 Python 文档:
class threading.Thread(group=None, target=None, name=None, args=(),
kwargs={}, *, daemon=None)
This constructor should always be called
with keyword arguments. Arguments are:
group should be None; reserved for future extension when a ThreadGroup
class is implemented.
target is the callable object to be invoked by the run() method.
Defaults to None, meaning nothing is called.
所以,更改:
thr = Thread(target=garden.grow()).start()
到
thr = Thread(target=garden.grow).start()
这个:
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!
我正在尝试实现一个小花园示例。
Garden 是一个具有 grow()
功能的 class,它每秒检查供水量。当水量超过某个阈值时,花园会开出几朵花。
这是我的第一次尝试:
花园class
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!")
main.py
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()
被调用它不会被锁定,直到 grow()
完成但继续到下一行。我在这里错过了什么?
我认为您想要 garden.grow
而不是 garden.grow()
。目标参数是一个 callable。您正在调用 grow
方法并传递其 return 值。
来自 Python 文档:
class threading.Thread(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)
This constructor should always be called with keyword arguments. Arguments are:group should be None; reserved for future extension when a ThreadGroup class is implemented.
target is the callable object to be invoked by the run() method. Defaults to None, meaning nothing is called.
所以,更改:
thr = Thread(target=garden.grow()).start()
到
thr = Thread(target=garden.grow).start()
这个:
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!