【问题标题】:Why can't I start two threads inside constructor __init__() of a python class?为什么我不能在 python 类的构造函数 __init__() 中启动两个线程?
【发布时间】:2018-10-28 02:44:52
【问题描述】:

我只是试图运行两个不同的守护线程并从每个线程中打印一行以进行测试。虽然这段代码有效:

import time
import threading
from threading import Thread
from myFunctions import *


class Monitoring:

    def alarms(self):
        return alarms.run()

    def generator(self):
        return generator.run()

    def run(self):
        generator = threading.Thread(target=self.alarms)
        generator.daemon = True
        generator.start()

        alarm = threading.Thread(target=self.generator)
        alarm.daemon = True
        alarm.start()

        print("started thread")



if __name__ == '__main__':
    try:
        d = Monitoring()
        d.daemon = True
        d.run()

        print("started the thread")

        while 1:
            time.sleep(1)

    except KeyboardInterrupt:
        alarms.close()
        generator.close()
        print("Main - Keyboard interrupt in __main__")

这样的事情似乎不起作用,只有第一个线程“警报”开始。这是为什么?

class Monitoring:

    def __init__(self,a,g):
        self.a = a
        self.g = g


    def run(self):
        generator = threading.Thread(target=self.a)
        generator.daemon = True
        generator.start()

        alarm = threading.Thread(target=self.g)
        alarm.daemon = True
        alarm.start()

        print("@class run() ")



if __name__ == '__main__':
    try:
        d = Monitoring(alarms.run(), generator.run())
        d.daemon = True
        d.run()

        print("@__main__")

        while 1:
            time.sleep(1)

    except KeyboardInterrupt:
        alarms.close()
        generator.close()
        print("Main - Keyboard interrupt in __main__")

【问题讨论】:

  • d = Monitoring(alarms.run(), generator.run()) 中,函数alarms.run(和generator.run)被立即调用,而不是在新线程中。可能你想要d = Monitoring(alarms.run, generator.run)
  • 非常感谢 MIchael,来自 Javascript,我无法正常工作。随意添加回复,我会接受的。成功了!

标签: python python-3.x multithreading python-2.7 class


【解决方案1】:

排队

d = Monitoring(alarms.run(), generator.run())

函数alarms.rungenerator.run 被立即调用,返回值(可能是None)作为Monitoring 构造函数的参数给出。

要将函数对象用作参数(然后在新线程中调用),请使用

d = Monitoring(alarms.run, generator.run)

改为。

【讨论】:

    猜你喜欢
    • 2011-08-03
    • 1970-01-01
    • 2020-03-06
    • 1970-01-01
    • 1970-01-01
    • 2012-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多