具有两个无限时功能的多线程

时间:2014-07-02 13:42:59

标签: python multithreading parallel-processing python-multithreading

我正在处理一个包含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

有点儿的东西

3 个答案:

答案 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之前完成其命令。以下是实际发生的情况。

  • 线程1输出字符串:' 1 \ n'
  • 线程2输出字符串:' 2 \ n'

注意新的行终止符。通常当你在python中使用Print命令打印任何东西时,命令会尝试追加' \ n'如果它可以导致下一个项目打印显示在新行上,则到项目的末尾。使用多线程时,同样的事情正在发生,但由于标准输出是共享资源,因此所有文本都不会以正确的顺序添加。

以下列表显示了将字符添加到显示屏的顺序。

  1. 1
  2. 2
  3. \ n
  4. \ n
  5. 因此,如果新行字符可见,则显示将如下所示。

    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