线程池,协程

Posted godisgirl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程池,协程相关的知识,希望对你有一定的参考价值。

 

线程的其他方法: 

  Threading.current_thread() #当前线程对象
  GetName() 获取线程名
  Ident 获取线程id
  Threading.Enumerate() #当前正在运行的线程对象的一个列表
  Threading.active_count() #当前正在运行的线程数量

  

 1 import time
 2 import threading
 3 from threading import Thread,current_thread
 4 def fn(n):
 5     time.sleep(1)
 6     print(子线程名称:,current_thread().getName())
 7     print(%s线程任务%n)
 8 def f2(n):
 9     time.sleep(1)
10     print(子线程名称:,current_thread().getName())
11     print(%s线程任务%n)
12 if __name__ == __main__:
13     t1 = Thread(target=fn,args=(1,))
14     t2 = Thread(target=f2,args=(2,))
15     t1.start()
16     t2.start()
17     print(主线程名称:,current_thread().getName())
18     print(主线程ID:,current_thread().ident)
19     print(current_thread())
20     print(threading.enumerate())
21     print(threading.active_count())

 

线程队列:

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

方法:
  q.put() 进
  q.put_nowait()不阻塞的进,超出队列长度会报错 Exception
  q.qsize() 查看当前队列长度
  q.full() 查看当前队列是否满了,返回True或返回False

  q.get() 取
  q.get_nowait() 不阻塞的取,超出队列长度会报错 Exception
  q.empty() 查看当前队列是否空了,返回True或返回False

 1 import queue
 2 q = queue.Queue(4)
 3 q.put(1)
 4 q.put(2)
 5 q.put(3)
 6 print(q.qsize())
 7 q.put(4)
 8 print(q.full())
 9 try:
10     q.put_nowait(1)
11 except Exception:
12     print(队列满了)
13 print(q.get())
14 print(q.get())
15 print(q.get())
16 print(q.get())
17 print(q.empty())
18 try:
19     q.get_nowait()
20 except Exception:
21     print(队列空了)
22 
23 import queue
24 q = queue.LifoQueue(4)
25 q.put(1)
26 q.put(2)
27 q.put(3)
28 q.put(4)
29 print(q.get())
30 print(q.get())
31 print(q.get())
32 print(q.get())
33 
34 import queue
35 q = queue.PriorityQueue(3)
36 q.put((3,123))
37 q.put((5,[1,2,3]))
38 q.put((8,(1,2,3,)))
39 print(q.get())
40 print(q.get())
41 print(q.get())

 

线程池:

  submit #异步提交任务
  result #和get方法一样,如果没有结果,会等待,阻塞程序
  shutdown #主线程等待所有提交给线程池的任务,全部执行完毕 close + join


import time,threading,gevent
from gevent import monkey;monkey.patch_all()
def f1():
print(‘第一次f1‘)
print(threading.current_thread().getName())
gevent.sleep(1)
time.sleep(1)
print(‘第二次f1‘)
def f2():
print(‘第一次f2‘)
print(threading.current_thread().getName())
gevent.sleep(1)
time.sleep(2)
print(‘第二次f2‘)
s = time.time()
g1 = gevent.spawn(f1) #异步提交任务
g2 = gevent.spawn(f2)
gevent.joinall([g1,g2]) #相当于g1 跟 g2 都执行了join方法
e = time.time()
print(‘执行时间:‘,e-s)
print(‘主程序结束‘)
 

 

线程池回调函数: from conncurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor

1 from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
2 def f1(n,s):
3     return n + s
4 def f2(n):
5     print(回调函数>>>,n.result())
6 if __name__ == __main__:
7     t = ThreadPoolExecutor(4)  #这里可以更改为ProcessPoolExecutor使用
8     res = t.submit(f1,11,12).add_done_callback(f2)   #将f1中的值回调给f2    

 

多线程实现socket

 1 #服务端
 2 import threading
 3 import socket
 4 server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
 5 server.bind((127.0.0.1,8080))
 6 server.listen(5)
 7 def action(conn):
 8     while True:
 9         data=conn.recv(1024)
10         print(data.decode(utf-8))
11         msg = input(服务端输入:) #在多线程里面可以使用input输入内容,那么就可以实现客户端和服务端的聊天了,多进程不能输入
12         conn.send(msg.encode(utf-8))
13 
14 if __name__ == __main__:
15 
16     while True:
17         conn,addr=server.accept()
18         p=threading.Thread(target=action,args=(conn,))
19         p.start()
 1 #客户端
 2 import socket
 3 client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
 4 client.connect((127.0.0.1,8080))
 5 while True:
 6     msg=input(>>: ).strip()
 7     if not msg:continue
 8 
 9     client.send(msg.encode(utf-8))
10     data=client.recv(1024)
11     print(data.decode(utf-8))

 









































以上是关于线程池,协程的主要内容,如果未能解决你的问题,请参考以下文章

Python入门学习-DAY37-进程池与线程池协程gevent模块

python全栈脱产第37天------进程池与线程池协程gevent模块单线程下实现并发的套接字通信

聊一聊线程池和Kotlin协程

newCacheThreadPool()newFixedThreadPool()newScheduledThreadPool()newSingleThreadExecutor()自定义线程池(代码片段

Python爬虫--高性能的异步爬虫

python协程,线程的其他方法