start.py代码如下。相同的程序不同的线程输出模块
import threading
class myThread(threading.Thread):
def __init__(self, threadID, name):
threading.Thread.__init__(self)
self.threadID = threadID
self.name = name
def run(self):
currentThreadname = threading.currentThread()
print "running in ", currentThreadname
thread = myThread(1,"mythrd")
thread.start()
用python启动它两次。
python start.py
running in <myThread(mythrd, started 140461133485824)>
python start.py
running in <myThread(mythrd, started 140122860668672)>
run.py代码如下。
import threading
class myThread(threading.Thread):
def __init__(self, threadID, name):
threading.Thread.__init__(self)
self.threadID = threadID
self.name = name
def run(self):
currentThreadname = threading.currentThread()
print "running in ", currentThreadname
thread = myThread(1,"mythrd")
thread.run()
run.py只有一行不同于start.py。
现在启动两次run.py。
python run.py
running in <_MainThread(MainThread, started 139854546364160)>
python run.py
running in <_MainThread(MainThread, started 139854546364160)>
startandrun.py代码如下。
class myThread(threading.Thread):
def __init__(self, threadID, name):
threading.Thread.__init__(self)
self.threadID = threadID
self.name = name
def run(self):
currentThreadname = threading.currentThread()
print "running in ", currentThreadname
thread = myThread(1,"mythrd")
thread.start()
thread.run()
现在启动两次startandrun.py。
python startandrun.py
running in <myThread(mythrd, started 140317119899392)>
running in <_MainThread(MainThread, started 140317144454912)>
python startandrun.py
running in running in <_MainThread(MainThread, started 139980210505472)>
<myThread(mythrd, started 139980185949952)>
由于JohanL说:
当运行两个独立的线程,所有的赌注都关闭哪个会首先执行。
您基本上将调度离开到操作系统。 第一次执行startandrun.py,thread.start()
thread.run()
之前被执行,它导致输出:
running in <myThread(mythrd, started 140317119899392)>
running in <_MainThread(MainThread, started 140317144454912)>
第二时间来执行startandrun.py,thread.start()
thread.run()
之后被执行,为什么不导致输出:
running in <_MainThread(MainThread, started 140317144454912)>
running in <myThread(mythrd, started 140317119899392)>
,而不是
running in running in <_MainThread(MainThread, started 139980210505472)>
<myThread(mythrd, started 139980185949952)>
当运行两个独立的线程中,所有的赌注都关闭,以它将首先执行。您基本上将时间安排交给操作系统。这就是为什么当你的线程访问相同的数据时你需要不同的同步原语(信号量,监视器等)。 – JohanL
'thread.run'不会启动一个新线程,所以这段代码可能不会做你认为正在做的事。要开始一个线程,你需要调用'start'。你不应该直接调用'run','start'会为你做。调用开始和运行只是为了进一步混淆你试图理解的任何问题。请参阅文档,对此非常清楚:“创建线程对象后,必须通过调用线程的start()方法来启动它的活动,然后在单独的控制线程中调用run()方法。” – pvg