线程:操作系统进行运算调度的最小单位,是一串单一顺序指令的集合。在python中的线程是C语言原生线程(操作系统),由操作系统管理。
由于GIL的存在,使任何时刻同一进程里只能有一个线程正在运行。
python里是不能多线程并发的,无论cpu是多少核的!
python 线程知识点:
(1)线程的创建 :
方法一
import  threading,time
def run(n):
    print(n, 'start',threading.get_ident)
    time.sleep(1)
    print(n, 'done')
t = threading.Thread(target=run, args=(i,2))
t.start()
print(threading.current_thread())
方法二
import threading,time
class Mythread(threading.Thread):
    def __init__(self,n):
        super(Mythread, self).__init__()
        self.n  =  n
    def run(self):
        print("xxxx %s"%self.n)
t1= Mythread('t1')
t2= Mythread('t2')
t1.start()
t2.start()
(2)线程锁:
import threading,time
num = 0
lock = threading.Lock()
def run(n):
    global num
    start =time.time()
    lock.acquire()   #进程锁(互斥锁)
    for i in range(1000000):
         num +=1
    time.sleep(1)
    lock.release()
    print(n,time.time()-start)
  
t_obj =[]
for i in range(2):
    t = threading.Thread(target=run,args=(i,))
    t.start()
    t_obj.append(t)
for t in t_obj:
   t.join()
print("num",num)
递归锁
import threading, time
def run1():
    print("grab the first part data")
    lock.acquire()
    global num
    num += 1
    lock.release()
    return num
def run2():
    print("grab the second part data")
    lock.acquire()
    global num2
    num2 += 1
    lock.release()
    return num2
def run3():
    lock.acquire()
    res = run1()
    print('--------between run1 and run2-----')
    res2 = run2()
    lock.release()
    print(res, res2)
num, num2 = 0, 0
lock = threading.RLock()#递归锁
for i in range(1):
    t = threading.Thread(target=run3)
    t.start()
while threading.active_count() != 1:
    print(threading.active_count())
else:
    print('----all threads done---')
    print(num, num2)
(3)守护进程:
for i in range(50):
    t = threading.Thread(target=run,args=(i,))
    t.setDaemon(True)#设置守护进程,主线程不需要等子线程执行完毕,程序完毕
    t.start()
(4)信号量:
import threading, time
def run(n,a):
    semaphore.acquire()
    print("run the thread: %s\n" % n)
    time.sleep(a)
    semaphore.release()
if __name__ == '__main__':
    semaphore = threading.BoundedSemaphore(5)  # 最多允许5个线程同时运行
    for i in range(22):
        t = threading.Thread(target=run, args=(i,i))
        t.start()
while threading.active_count() != 1:
    pass  # print threading.active_count()
else:
    print('----all threads done---')
    #print(num)
(5)队列:
queue.Queue(n)先进先出 queque.LifiQueue(n)后进先出 queue.PriorityQueue(n)可设置优先级的队列 n允许放多少个数据 queue.put(maxsize,block,timeout)放数据 block 是否堵塞 timeout 堵塞时间 queue.get(block,timeout)取数据 queue.size
import queue
q = queue.Queue(3)
q.put(1)
q.put(2)
q.put(3)
print(q.qsize())
print(q.get())
print(q.get())
print(q.get())
try:
    print(q.get(block=False))
except queue.Empty  as e:
    print("queue is empty")
(6)事件
事件,线程之间用来同步的工具even.set()设定标志位even.clear()清除标志位even.is_set()判断是否设置even = threading.Even()
import threading,time
state_list = ['red','yellow','green']
state =''
lock = threading.Lock()
even = threading.Event()
even1 = threading.Event()
def run():
    count =0
    while True:
        if count <10:
            even.clear()
            print('led state is: \033[41;1m red \033[0m \n')
        elif count >=10 and count <15:
            print('led state is: \033[43;1m yellow \033[0m \n')
        elif count >=15 and count <25:
            even.set()
            print('led state is:  \033[42;1m green \033[0m \n')
        else:
            count = 0
        count +=1
        time.sleep(1)
def run1():
    global state
    while True:
        if even.is_set():
            print("i am go\n")
            time.sleep(1)
        else:
            print("i am stop\n")
            even.wait()
t = threading.Thread(target=run)
t.start()
t1 = threading.Thread(target=run1)
t1.start()