threading模块:
1、创建一个线程:
target:后面加目标函数名 ,不加括号。name是线程名字,args是传递的参数,多加一个逗号。
import threading
import time
def listen(x):
print("{}begin listen {}".format(x,time.ctime()))
time.sleep(3)
print("end listen {}".format(time.ctime()))
def game():
print("begin game {}".format(time.ctime()))
time.sleep(5)
print("end game {}".format(time.ctime()))
if __name__ == '__main__':
t1 = threading.Thread(target=listen,args=('Jax',),name='2333')
t2 = threading.Thread(target=game)
t1.start()
t2.start()
# 主进程
print("--------")
>>> Jaxbegin listen Sat Nov 24 12:26:25 2018
>>> begin game Sat Nov 24 12:26:25 2018
>>> --------
>>> end listen Sat Nov 24 12:26:28 2018
>>> end game Sat Nov 24 12:26:30 2018
此时 t1和 t2 都是实例的对象。并没有真正的运行。print函数也是一个进程,相当于本程序有三个进程,一个主进程,两个子进程。三个同时运行,所以输出语句也会最先被打印出来。
--------------------------------------------------------------萌萌哒的分割线--------------------------------------------------------------------------------------------------
start()方法:线程开始执行,激活线程,处于就绪态。 join():等待当前线程执行完毕,阻塞线程,才会继续向下执行。
import threading
import time
def listen(x):
print("{} begin listen {}".format(x,time.ctime()))
time.sleep(3)
print("end listen {}".format(time.ctime()))
def game():
print("begin game {}".format(time.ctime()))
time.sleep(5)
print("end game {}".format(time.ctime()))
if __name__ == '__main__':
t1 = threading.Thread(target=listen,args=('Jax',),name='2333')
t2 = threading.Thread(target=game)
t1.start()
t2.start()
t1.join()
t2.join()
# 主进程
print("--------")
>>> Jaxbegin listen Sat Nov 24 12:25:20 2018
>>> begin game Sat Nov 24 12:25:20 2018
>>> end listen Sat Nov 24 12:25:23 2018
>>> end game Sat Nov 24 12:25:25 2018
>>> --------
还可以通过一个循环来实例线程:
import threading
import time
def listen(x):
print("{}begin listen {}".format(x,time.ctime()))
time.sleep(3)
print("end listen {}".format(time.ctime()))
def game():
print("begin game {}".format(time.ctime()))
time.sleep(5)
print("end game {}".format(time.ctime()))
thread = []
t1 = threading.Thread(target=listen,args=('Jax',),name='2333')
t2 = threading.Thread(target=game)
thread.append(t1)
thread.append(t2)
if __name__ == '__main__':
for t in thread:
t.start()
t.join()
t.join() # 此时相当于join t2
# 主进程
print("--------")
将创建的进程加入列表,通过遍历列表实例一个线程。
守护线程:子线程和主线程一同退出。当主线程退出时一同退出,不管子线程是否结束。如果有其中一个子线程没有设置相当于主线程仍然没有完,仍然会等待子线程结束。
t.setDaemon(true) 设置当前线程为守护进程。必须在该线程的start方法前设置。也可以通过t.daemon = True来设置守护线程。
import threading
import time
def listen(x):
print("{}begin listen {}".format(x,time.ctime()))
time.sleep(3)
print("end listen {}".format(time.ctime()))
def game():
print("begin game {}".format(time.ctime()))
time.sleep(5)
print("end game {}".format(time.ctime()))
thread = []
t1 = threading.Thread(target=listen,args=('Jax',),name='2333')
t2 = threading.Thread(target=game)
thread.append(t1)
thread.append(t2)
if __name__ == '__main__':
for t in thread:
t.setDaemon(True)
t.start()
# 主进程
print("--------")
>>> Jaxbegin listen Sat Nov 24 12:46:20 2018
>>> begin game Sat Nov 24 12:46:20 2018
>>> --------
当主线程退出时只会查看不是守护线程的线程,如果需要等待就等待,守护线程随主线程一起结束。在等待不是守护线程的过程相当于主线程没有结束,守护线程的那些线程仍会继续向下执行。主线程只会等待不是守护线程的线程,不会等待守护线程。守护亦可理解为跟随,跟随主线程一同退出。
当运行时间短的线程为守护线程时:
import threading
import time
def listen(x):
print("{}begin listen {}".format(x,time.ctime()))
time.sleep(3)
print("end listen {}".format(time.ctime()))
def game():
print("begin game {}".format(time.ctime()))
time.sleep(5)
print("end game {}".format(time.ctime()))
thread = []
t1 = threading.Thread(target=listen,args=('Jax',),name='first thread')
t2 = threading.Thread(target=game)
thread.append(t1)
thread.append(t2)
if __name__ == '__main__':
t2.setDaemon(True)
for t in thread:
t.start()
print("--------")
>>> Jaxbegin listen Sat Nov 24 13:15:26 2018
>>> begin game Sat Nov 24 13:15:26 2018
>>> --------
>>> end listen Sat Nov 24 13:15:29 2018
※:主线程并没有的等待守护线程结束,而是等待不是守护线程结束后退出。
其他方法:
isalive() 线程是否存活.。 getName() 获得线程名。 setName() 修改线程名。trun(): 用以表示线程活动的方法。start在t.run前面。
线程被调度后自动执行run方法。
threading.currentThread(): 返回当前的线程变量。 threading.active_count(): 有几个线程在活动。可以使当前线程为一的时候运行主线程。
import threading
import time
def listen(x):
print("{}begin listen {}".format(x,time.ctime()))
time.sleep(3)
print("end listen {}".format(time.ctime()))
def game():
print("begin game {}".format(time.ctime()))
time.sleep(5)
print("end game {}".format(time.ctime()))
thread = []
t1 = threading.Thread(target=listen,args=('Jax',),name='first thread')
t2 = threading.Thread(target=game)
thread.append(t1)
thread.append(t2)
if __name__ == '__main__':
for t in thread:
t.setDaemon(True)
t.start()
print(t.getName())
print(threading.current_thread())
print(t.is_alive())
print(threading.active_count())
# 主进程
print("--------")
>>> Jaxbegin listen Sat Nov 24 13:03:39 2018
>>> first thread
>>> <_MainThread(MainThread, started 1416)>
>>> True
>>> begin game Sat Nov 24 13:03:39 2018
>>> Thread-1
>>> <_MainThread(MainThread, started 1416)>
>>> True
>>> 3
>>> --------
另外的一个创建线程的方式:
import threading
class MyThread(threading.Thread):
def __init__(self,num):
super().__init__()
self.num = num
def run(self):
// 此方法需要被重写,start方法执行run方法。
print("+++++++++")
print("线程{}".format(self.num))
if __name__ == '__main__':
t1 = MyThread(1)
t2 = MyThread(2)
t1.start()
t2.start()
print("-----------")
>>> +++++++++
>>> 线程1
>>> +++++++++
>>> 线程2
>>> -----------
并不推荐这样的方法,是因为封闭性太强,推荐前面的方法。
※:多个线程共享内存。线程不能独立存在。线程最小执行单元。线程是进程的一个实体。一个线程可以创建一个线程,也可以撤销一个线程。