线程似乎按顺序运行线程

MAK*_*MAK 13 python multithreading

我正在尝试在我正在处理的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() 
Run Code Online (Sandbox Code Playgroud)

这是我从运行它得到的输出:

Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
world
world
world
world
world
world
world
world
world
world
Run Code Online (Sandbox Code Playgroud)

在循环的迭代次数更多的情况下观察到相同的行为.

我尝试搜索网络和较旧的SO答案,但我找不到任何有用的东西.有人可以指出这段代码有什么问题吗?

vir*_*tor 14

目前在python中,线程在执行一些指定数量的字节码指令后会发生变化.它们不会同时运行.当其中一个调用一些可以释放GIL(全局解释器锁)的I/O密集型或不受python影响的模块时,您将只有并行执行的线程.

我很确定如果你将循环次数增加到10000次就会让输出混乱.请记住,简单地产生第二个线程也需要"很多"时间.

  • 解决这个问题的另一种方法是使用`threading`模块的`multiprocessing` instread.这样你的代码实际上是并行运行的. (4认同)

Joc*_*zel 11

在第二个线程启动第一个线程循环和打印的时间.

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

Hello
Hello
Hello
Hello
Hello
Helloworld

Helloworld

Helloworld

Helloworld

Helloworld

world
world
world
world
world
Run Code Online (Sandbox Code Playgroud)

顺便说一下:你的例子根本没有意义.线程的唯一原因是IO,IO很慢.当您添加一些睡眠模拟IO时,它应该按预期工作:

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()
Run Code Online (Sandbox Code Playgroud)

一个狂野的混合出现:

worldHello

Helloworld

Helloworld

worldHello

Helloworld

Helloworld

worldHello

Helloworld

worldHello

Helloworld
Run Code Online (Sandbox Code Playgroud)

  • 即使for循环的迭代次数大得多/少,我也不会得到类似的输出.在我的电脑上,它始终是顺序的.我认为这与OS /处理器有关,正如abyx建议的那样. (2认同)