如何在 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!