多线程(threading——join)
join ()方法:主线程A中,创建了子线程B,并且在主线程A中调用了B.join(),那么,主线程A会在调用的地方等待,直到子线程B完成操作后,
才可以接着往下执行,那么在调用这个线程时可以使用被调用线程的join方法。join([timeout]) 里面的参数时可选的,代表线程运行的最大时
间,即如果超过这个时间,不管这个此线程有没有执行完毕都会被回收,然后主线程或函数都会接着执行的,如果线程执行时间小于参数表示的
时间,则接着执行,不用一定要等待到参数表示的时间。
import threading import time #创建两个测试的变量 num_1 = 0 num_2 = 0 def te_1(): global num_1 #将num_1加到 3 for i in range(3): num_1 += 1 print("我是num_1: " + str(num_1)) time.sleep(1) def te_2(): global num_2 #将num_2加到 3 for i in range(3): num_2 += 1 print("我是num_2: " + str(num_2)) time.sleep(1) t1 = threading.Thread(target=te_1) t1.start() t2 = threading.Thread(target=te_2) #join为等待线程,等待t1线程执行完,再执行t2线程 t1.join() t2.start()
多线程(threading——setDeamon)
setDaemon()方法。主线程A中,创建了子线程B,并且在主线程A中调用了B.setDaemon(),这个的意思是,把主线程A设置为守护线程,这
时候,要是主线程A执行结束了,就不管子线程B是否完成,一并和主线程A退出.这就是setDaemon方法的含义,这基本和join是相反的。此外,还有
个要特别注意的:必须在start() 方法调用之前设置,如果不设置为守护线程,程序会被无限挂起,只有等待了所有线程结束它才结束。
import threading import time #创建两个测试的变量 num_1 = 0 num_2 = 0 def te_1(): global num_1 #将num_1加到 3 for i in range(3): num_1 += 1 print("我是num_1: " + str(num_1)) time.sleep(1) def te_2(): global num_2 #将num_2加到 5 for i in range(5): num_2 += 1 print("我是num_2: " + str(num_2)) time.sleep(1) t1 = threading.Thread(target=te_1) t1.start() t2 = threading.Thread(target=te_2) #守护进程t2,当t1执行完后不再去执行t2 t2.setDaemon(t1) t2.start()
下面是如何解决time.sleep,其实非常简单,只需要创建一个线程让他自己执行就可以了
"""小白随笔,大佬勿喷""" '''tkinter解决time延迟问题''' import tkinter as tk import time import threading #初始化窗口 window = tk.Tk() #窗口名称 window.title("My Window") #窗口大小,是 x 不是 * window.geometry("400x400") #不能改变窗口的大小 window.resizable(width=False,height=False) def count(): label = tk.Label(window,bg='green') label.pack() button.pack() while True: try: #获取当前时间 date = time.strftime("%Y-%m-%d\n%H:%M:%S") label.config(text=date) #更新窗口 window.update() time.sleep(1) except: break #创建按钮,只是为了测试sleep与按钮之间是否存在延迟 button = tk.Button(window,text='Hit_me',width=20) #创建线程,如果函数里面有参数,args=() t = threading.Thread(target=count) #开启线程 t.start() #循环窗口 window.mainloop()
技术有限,不会录制gif图