线程的补充,协程

线程的其他方法:
Threading.current_thread() #当前线程对象
GetName() 获取线程名
Ident 获取线程id

Threading.Enumerate() #当前正在运行的线程对象的一个列表
Threading.active_count() #当前正在运行的线程数量

线程队列:(重点)
Import queue
先进先出队列:queue.Queue(3)
先进后出\后进先出队列:queue.LifoQueue(3)
优先级队列:queue.priorityQueue(3)
Put的数据是一个元组,元组的第一个参数是优先级数字,数字越小优先级越高,越先被get到被取出来,
第二个参数是put进去的值,如果说优先级相同,那么值别忘了应该是相同的数据类型,字典不行

import queue

# q = queue.Queue(3)
#
# q.put(1)
# q.put(2)
# q.put(3)
# print('查看队列是否满了',q.full())
#
# try:
#     q.put_nowait(4)
# except Exception:
#     print('队列满了')
#
# print(q.get())
# print(q.get())
# print('查看队列是否为空',q.empty())
# print(q.get())
# print('查看队列是否为空',q.empty())
# try:
#     q.get_nowait()
# except Exception:
#     print('队列空了')


# q1 = queue.LifoQueue(3)
#
# q1.put(1)
# q1.put(2)
# q1.put(3)
#
# print(q1.get())
# print(q1.get())
# print(q1.get())

q2 = queue.PriorityQueue(5)
q2.put((5,(2,3)))
q2.put((2,'alex'))  # 如果优先级数字相同,会比较第二个参数的元素的ascii表中的位置,如果数据类型不同会报错
q2.put((1,{'a': 5}))
q2.put((-1,45))
q2.put((2,'llsd'))

print(q2.get())
print(q2.get())
print(q2.get())
print(q2.get())
print(q2.get())

  

线程池:
From concurrent_futures import ThreadPoolExecutor,ProcessPoolExecutor

P = ThreadPoolExecutor(4) #默认的线程个数是cpu个数 * 5
P = ProcessPoolExecutor(4) #默认的进程个数是cpu个数
P.map(f1,可迭代的对象) #异步执行
Def f1(n1,n2):
Print(n1,n2)
P.submit(f1,11,12) #异步提交任务
Res = P.submit(f1,11,12)

Res.result() #和get方法一样,如果没有结果,会等待,阻塞程序

Shutdown() #close+join,锁定线程池,等待线程池中所有已经提交的任务全部执行完毕

import time
from threading import  current_thread
from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor

def f1(n,s):
    time.sleep(1)
    # print('%s号子线程' % current_thread().ident)
    # print(n,s)
    return n,s

if __name__ == '__main__':
    tp = ThreadPoolExecutor(4)
    # 异步提交任务,参数同样是任务名称,可迭代对象
    res_list = []
    for i in range(10):
        res = tp.submit(f1,i,'baobao')  #submit是给线程池异步提交任务,
        print(res)
        res_list.append(res)

    tp.shutdown()    #主线程等待所有提交给线程池的任务,全部执行完毕 close + join
    for r in res_list:
        print(r.result())
    print('主线程结束')

  

协程

import gevent
from gevent import monkey;monkey.patch_all()
import time
import threading

def f1():
    print('第一次f1')
    # print(threading.current_thread().getName())
    # gevent.sleep(1)
    time.sleep(2)
    print('第二次f1')

def f2():
    # print(threading.current_thread().getName())
    print('第一次f2')
    # gevent.sleep(2)
    time.sleep(2)
    print('第二次f2')

s= time.time()
g1 = gevent.spawn(f1)  # 异步提交了f1任务
g2 = gevent.spawn(f2)   # 异步提交了f2任务
g1.join()
g2.join()
gevent.joinall([g1, g2])
e = time.time()
print('执行时间:', e-s)
print('主程序任务')

  

猜你喜欢

转载自www.cnblogs.com/YangWenYu-6/p/10267502.html