python threading join 实验

join 官方的解释 https://docs.python.org/3/library/threading.html#module-threading

原文解释是这样的:

Wait until the thread terminates. This blocks the calling thread until the thread whose join() method is called terminates – either normally or through an unhandled exception – or until the optional timeout occurs.
		

官方的解释太官方了

实际使用的时候需要注意 join 跟 start 的使用顺序

我写了两份代码,实现一个简单的逻辑( 定义两个线程,一个全局变量 target , 第一个线程每隔两秒修改一次 target ,第二个线程每秒展示一次 target )

这是我的第一份代码,它是没法达到目标的

import threading
import time

target = -1024

class OK(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
    def run(self):
        global target
        while True:
            time.sleep(2)
            target = target + 1
class SayHello(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
    def run(self):
        global target
        while True:
            time.sleep(1)
            print("%s:target==%d"%(time.ctime(),target))
B = OK()
B.start()
B.join()
a = SayHello()
a.start()
a.join()

第二份代码改为如下

...
...

B = OK()
B.start()
a = SayHello()
a.start()
a.join()
B.join()

它跑得很好

关于线程,我有次去一家互联网公司面试,其中被问到得一个问题,线程是否共用 栈里面的变量,现在瞬板试了试

实施过程: 在 两个 run 函数中分别增加了一行 ,print(id(target))

Sun Jan 13 21:38:58 2019:target==-1017 id(target)==2243799581392
Sun Jan 13 21:38:59 2019:target==-1017 id(target)==2243799581392
2243799581392
Sun Jan 13 21:39:00 2019:target==-1016 id(target)==2243799581424
Sun Jan 13 21:39:01 2019:target==-1016 id(target)==2243799581424
2243799581424
Sun Jan 13 21:39:02 2019:target==-1015 id(target)==2243799581392
Sun Jan 13 21:39:03 2019:target==-1015 id(target)==2243799581392
2243799581392
Sun Jan 13 21:39:04 2019:target==-1014 id(target)==2243799581424
Sun Jan 13 21:39:05 2019:target==-1014 id(target)==2243799581424

结果变成了上面这样的

答案很显然