首页 > 代码库 > python线程
python线程
Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元。
import threading import time def show(arg): time.sleep(1) print ‘thread‘+str(arg) for i in range(10): t = threading.Thread(target=show, args=(i,)) t.start() print ‘main thread stop‘
上述代码中创建了10个线程,然后控制器就交给了CPU,CPU根据制定算法进行调度,分片执行指令。
更多方法:
start: 线程准备就绪,等待CPU调度
setName:为线程设置名称
getName:获取线程名称
setDaemon:设置为后台线程或前台线程(默认为前台线程)。如果为后台线程,主线程执行完毕后,后台线程不论成功与否,均停止。如果为前台线程,主线程执行完毕后,等待前台线程也执行完毕,程序停止。
join :当每个线程执行完毕后继续往下执行,该方法使得多线程变得无意义
run :线程被CPU调度后自动执行线程对象的run方法。
import threading, time
def f1(arg,a):
print(arg,a)
time.sleep(2)
print(‘老司机等等我‘)
f1(111, ‘zxc‘)
for i in range(5):
t = threading.Thread(target=f1, args=(123,‘qwe‘,))
t.setDaemon(True) #为True表示主线程不等待子线程,默认为False
t.start()
t.join(2) #表示主线程执行到此处时,等待子线程,参数为等待超时时间,可为空
print(‘老司机开车到站了‘)
线程锁:
由于线程之间是进行随机调度,并且每个线程可能执行n条之后,当多个线程同事修改同一条数据时可能会出现脏数据,所以,出现了线程锁,即同一时刻允许一个线程执行操作。
import threading, time NUM = 10 def func(l): global NUM l.acquire() NUM -= 1 time.sleep(2) print(NUM) l.release() lock = threading.RLock() for i in range(9): t = threading.Thread(target=func, args=(lock,)) t.start()
在上述代码中如果不使用线程锁,那么输出结果将全部是1.
信号量(Semaphore):
互斥锁同时只允许一个线程更改数据,而信号量同事允许一定数量的线程更改数据。
NUM = 10 def func(i, l): global NUM l.acquire() NUM -= 1 #time.sleep(2) print(i, NUM) l.release() lock = threading.BoundedSemaphore(5) #最多允许5个线程同时运行 for i in range(30): t = threading.Thread(target=func, args=(i,lock,)) t.start()
事件(event):
python线程的事件用于主线程控制其他线程的执行,事件主要提供了三个方法:set、wait、clear。事件处理的机制:全局定义了一个flag,如果flag为False,那么执行程序执行event.wait方法时就会阻塞,如果flag值为True,那么event.wait方法就不阻塞。
def func(i, e): print(i) e.wait() #检测event是什么状态,如果是clear状态则在此等待 print(i+100) event = threading.Event() for i in range(30): t = threading.Thread(target=func, args=(i, event,)) t.start() event.clear() #表示锁住线程 inp = input(">>:") if inp: event.set() #表示解锁线程
条件(Condition)
使得线程等待,只有满足条件时,才释放n个线程
def func(i, con): print(i) con.acquire() con.wait() print(i+10) con.release() c = threading.Condition() for i in range(10): t = threading.Thread(target=func, args=(i,c,)) t.start() while True: inp = input(‘>>:‘) if inp == ‘q‘:break c.acquire() c.notify(int(inp)) c.release()
def condition(): ret = False inp = input(‘>>:‘) if inp:ret = True return ret def func(i, con): print(i) con.acquire() con.wait_for(condition) print(i+100) con.release() c = threading.Condition() for i in range(10): t = threading.Thread(target=func, args=(i, c,)) t.start()
Timer:
定时器,指定n秒后执行某操作
from threading import Timer def hello(): print(‘hello‘) t = Timer(1, hello) t.start()
python线程