代码之家  ›  专栏  ›  技术社区  ›  MAK

线程显示为按顺序运行线程

  •  12
  • MAK  · 技术社区  · 16 年前

    我试图在我正在处理的Python项目中使用线程,但线程的行为似乎与我的代码中的预期不同。似乎所有线程都是按顺序运行的(即线程2在线程1结束后启动,而不是同时启动)。我编写了一个简单的脚本来测试这一点,它也按顺序运行线程。

    import threading
    
    def something():
        for i in xrange(10):
            print "Hello"
    
    def my_thing():
        for i in xrange(10):
            print "world"   
    
    threading.Thread(target=something).start()
    threading.Thread(target=my_thing).start() 
    

    Hello
    Hello
    Hello
    Hello
    Hello
    Hello
    Hello
    Hello
    Hello
    Hello
    world
    world
    world
    world
    world
    world
    world
    world
    world
    world
    

    循环的迭代次数要多得多,可以观察到相同的行为。

    有人能指出这个代码有什么问题吗?

    4 回复  |  直到 8 年前
        1
  •  15
  •   viraptor    16 年前

    我敢肯定,如果你把循环的数量增加到10000个左右,你会把输出搞混。记住,简单地生成第二个线程也需要“很多”时间。

        2
  •  11
  •   martineau    8 年前

    在第二个线程开始第一个线程循环和打印的时间内。

    这里看起来像这样,你可以看到第二个线程在第一个线程发出几声Hello后开始。

    Hello
    Hello
    Hello
    Hello
    Hello
    Helloworld
    
    Helloworld
    
    Helloworld
    
    Helloworld
    
    Helloworld
    
    world
    world
    world
    world
    world
    

    import threading
    from time import sleep
    
    def something():
        for i in xrange(10):
            sleep(0.01)
            print "Hello"
    
    def my_thing():
        for i in xrange(10):
            sleep(0.01)
            print "world"
    
    threading.Thread(target=something).start()
    threading.Thread(target=my_thing).start()
    

    worldHello
    
    Helloworld
    
    Helloworld
    
    worldHello
    
    Helloworld
    
    Helloworld
    
    worldHello
    
    Helloworld
    
    worldHello
    
    Helloworld
    
        3
  •  4
  •   Dave Kirby    16 年前

    根据系统使用的是单处理器还是多处理器,行为也可能发生变化,如 this talk 大卫·比兹利。

    正如viraptor所说,第一个线程将在执行sys.getcheckinterval()字节码(默认为100)后释放GIL。粗略地总结一下David Beazley所说的,在单处理器系统上,第二个线程将有机会接管。但是,在多核系统上,第二个线程可能运行在不同的核上,第一个线程将尝试重新获取锁,并且可能会成功,因为操作系统没有时间切换处理器。这意味着,在一个多核系统上,有一个CPU绑定的线程,其他线程可能永远看不到。

        4
  •  3
  •   abyx    16 年前


    除此之外,众所周知,CPython的线程并不完美,因为 GIL