我正在处理一个包含while循环的代码,该循环的条件始终为True。 是否有一些方法可以启动两个线程并运行它们,尽管存在无限循环。?
##code
from threading import Thread
class myClass():
def __init__():
##code here..
def run(self):
print 'Starting '
while(True):
print '1'
class myClassSecond():
def __init_():
##code here
def run(self):
print 'starting second'
while(True):
print '2'
if __name__=='__main__':
a=myClass()
b=myClassSecond()
aa=Thread(a.run())
bb=Thread(b.run())
aa.start()
bb.start()
aa.join()
执行时,线程aa开始但由于while循环,aa不会退出自己。由于这个线程bb将无法启动。是否有任何其他方法可以启动这两个线程。(PS while while循环不能从代码中删除。)
输出:
1
1
1
1
1
and so on.
所需输出: 至少应该给我一些喜欢的东西:
1
2
有点儿的东西
答案 0 :(得分:3)
可以在以下链接中找到有关在python中学习并发(多线程)的参考资料的好教程。
http://www.tutorialspoint.com/python/python_multithreading.htm
我去修改了你提供的代码示例,让它像你解释的那样执行,保持代码尽可能与原始示例相似。
from threading import Thread
class myClass(Thread):
def __init__(self):
Thread.__init__(self)
def run(self):
print 'Starting'
while True:
print '1'
class myClassSecond(Thread):
def __init__(self):
Thread.__init__(self)
def run(self):
print 'Starting Second'
while True:
print '2'
if __name__ == '__main__':
a = myClass()
b = myClassSecond()
a.start()
b.start()
此示例的输出如下所示。
>>>
Starting
>>> Starting Second
12
12
12
12
12
12
12
12
12
12
12
12
12
12
在输出中,您会注意到两个线程输出都打印到同一行,并且每行数字之间都有一个空行。发生这种情况是因为标准输出(打印功能)是共享资源。这意味着每个线程都在竞争这个资源。每个线程都可以访问标准输出,但是不保证顺序,也不能保证每个线程能够在给予其他线程控制CPU之前完成其命令。以下是实际发生的情况。
注意新的行终止符。通常当你在python中使用Print命令打印任何东西时,命令会尝试追加' \ n'如果它可以导致下一个项目打印显示在新行上,则到项目的末尾。使用多线程时,同样的事情正在发生,但由于标准输出是共享资源,因此所有文本都不会以正确的顺序添加。
以下列表显示了将字符添加到显示屏的顺序。
因此,如果新行字符可见,则显示将如下所示。
12\n
\n
希望这有助于您更好地了解线程,并帮助您解决线程问题。
-Andrew
答案 1 :(得分:2)
问题是你永远不会创建你的线程......其中任何一个。您正在处理第一次调用Thread
的参数,并在a.run()
中输入无限循环。你需要让Thread
来电,而不是你。将run()
更改为run
并将其设置为target
,如下所示:
if __name__=='__main__':
a=myClass()
b=myClassSecond()
aa=Thread(target=a.run)
bb=Thread(target=b.run)
...
注意:Thread
的第一个参数是group
,这不是您想要的。
另外,您可能需要考虑使您的线程对象实际上从Thread
继承。然后你可以简单地做:
class myClass(Thread):
def run(self):
print 'Starting '
while(True):
print '1'
class myClassSecond(Thread):
def run(self):
print 'starting second'
while(True):
print '2'
if __name__=='__main__':
a=myClass()
b=myClassSecond()
a.start()
b.start()
...
答案 2 :(得分:0)
您忘记调用join()
:
aa.start()
bb.start()
aa.join() # <--
以下是文档链接:https://docs.python.org/2/library/threading.html#threading.Thread.join