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次就会让输出混乱.请记住,简单地产生第二个线程也需要"很多"时间.
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)