Python创建的线程数比预期的多2倍

Nat*_*anD 3 python multithreading

我是Python的新手,所以如果这是显而易见的话我会道歉.

我正在尝试构建多线程应用程序,但是当我想创建一个线程时,我得到两个而不是一个.

MyThread.py

from threading import Thread
import time

class MyThreadClass(Thread):

    def __init__(self):
        Thread.__init__(self)

    def run(self):
        print "starting " + self.getName() + "\n"
        from main import var1
        while True:
            print self.getName() + " is running\n"
            print "value: " + var1 + "\n"
            time.sleep(1)
Run Code Online (Sandbox Code Playgroud)

main.py

from MyThread import MyThreadClass
var1 = "Test"
MyThreadClass().start()
Run Code Online (Sandbox Code Playgroud)

我得到的输出

 Thread-1 is running
 Thread-2 is running
 Thread-1 is running
 Thread-2 is running
 Thread-1 is running
 Thread-2 is running
 .....
Run Code Online (Sandbox Code Playgroud)

为什么会这样?我注意到,如果我替换MyThreadClass().start(),MyThreadClass().run()我得到2个线程,但只有一个继续运行

 Thread-1 is running
 Thread-2 is running
 Thread-2 is running
 Thread-2 is running
 Thread-2 is running
 .....
Run Code Online (Sandbox Code Playgroud)

知道代码有什么问题吗?

slo*_*oth 9

当您导入main.pyMyThread.py,该行

MyThreadClass().开始()

再次执行(因为模块被加载),因此启动第二个线程.


您可以main.py通过替换该行来创建一个保护子句

if __name__ == "__main__":
    MyThreadClass().run()
Run Code Online (Sandbox Code Playgroud)

或者更好,只需传递var1MyThreadClass参数以避免循环依赖.

MyThread.py:

from threading import Thread
import time

class MyThreadClass(Thread):

    def __init__(self, var1):
        Thread.__init__(self)
        self.var1 = var1

    def run(self):
        print "starting " + self.getName() + "\n"
        while True:
            print self.getName() + " is running\n"
            print "value: " + self.var1 + "\n"
            time.sleep(1)
Run Code Online (Sandbox Code Playgroud)

main.py

from MyThread import MyThreadClass

if __name__ == "__main__":
    MyThreadClass("Test").run()
Run Code Online (Sandbox Code Playgroud)