我有点困惑。
我正在尝试在循环中启动一个线程,即:
while True:
my_thread.start()
我有点困惑,因为我已经使用了my_thread.run()
,但是当我将它交换为start()时,它无法启动多个线程。我的.run()实际上不是一个单独的线程,如果不是应该我在做什么?最后,我可以将变量传递给start()吗?
答案 0 :(得分:7)
你是正确的,run()
不会产生一个单独的线程。它在当前线程的上下文中运行线程函数。
通过在循环中调用start()
,我不清楚您要实现的目标。
Thread
个对象(并在每个对象上调用start()
)。最后,要将参数传递给线程,请将args
和kwargs
传递给Thread
constructor。
答案 1 :(得分:3)
您可以不生成多个线程,如下所示:
while True:
my_thread.start() # will start one thread, no matter how many times you call it
改为使用:
while True:
ThreadClass( threading.Thread ).start() # will create a new thread each iteration
threading.Thread( target=function, args=( "parameter1", "parameter2" ))
def function( string1, string2 ):
pass # Just to illustrate the threading factory. You may pass variables here.
答案 2 :(得分:1)
请阅读threading code and docs。每个线程对象最多只能调用一次 start()。它安排在单独的控制线程中调用对象的 run()方法。 run()将由 start()在上下文中调用,如下所示:
def start(self):
....
_start_new_thread(self._bootstrap, ())
....
def _bootstrap(self):
....
self._bootstrap_inner()
....
def _bootstrap_inner(self):
...
self.run()
...
让我们来演示一下start()和run()。
class MyThread(threading.Thread):
def __init__(self, *args, **kwargs):
super(MyThread, self).__init__(*args, **kwargs)
def run(self):
print("called by threading.Thread.start()")
if __name__ == '__main__':
mythread = MyThread()
mythread.start()
mythread.join()
$ python3 threading.Thread.py
called by threading.Thread.start()