如何在python中增加Thread中的类字段?

时间:2016-01-01 16:10:31

标签: python multithreading multiprocessing

我正在尝试实施一个小花园的例子。 花园是一个具有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()完成但继续到下一行。我在这里缺少什么?

3 个答案:

答案 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()