"""
----线程/进程池----
与信号量的区别 ,信号量也是一种锁 适用于保证同一时间能有多少个进程或线程访问
而线程/进程池,没有对数据访问进行限制仅仅是控制数量
"""
创建线程池
from concurrent.futures import ThreadPoolExecutor
from threading import active_count,current_thread
import time
# 创建线程池 指定最大线程数为3 如果不指定 默认为CPU核心数 * 5
pool = ThreadPoolExecutor(3)# 不会立即开启子线程
print(active_count())
def task():
print("%s running.." % current_thread().name)
time.sleep(1)
#提交任务到线程池
for i in range(10):
pool.submit(task)
创建进程池
from concurrent.futures import ProcessPoolExecutor
import os,time
# 创建进程池 最大进程数为3 默认为cpu个数
pool = ProcessPoolExecutor(3)# 不会立即开启子进程
# time.sleep(10)
def task():
print("%s running.." % os.getpid())
time.sleep(1)
if __name__ == '__main__':
# #提交任务到进程池
for i in range(10):
pool.submit(task)
# 第一次提交任务时会创建进程 ,后续再提交任务,直接交给以及存在的进程来完成,如果没有空闲进程就等待
多线程TCP服务器
# ----多线程TCP服务器----
from concurrent.futures import ThreadPoolExecutor
import socket
server = socket.socket()
server.bind(("127.0.0.1", 8989))
server.listen()
# 创建线程池 指定最大线程数为3 如果不指定 默认为CPU核心数 * 5
pool = ThreadPoolExecutor(3) # 不会立即开启子线程
def task(client):
while True:
try:
data = client.recv(1024)
if not data:
client.close()
break
client.send(data.upper())
except Exception:
client.close()
break
while True:
client, addr = server.accept()
# 第一次提交任务时会创建线程,后续再提交任务,直接交给以及存在的线程来完成,如果没有空闲线程就等待
pool.submit(task, client) # 将运行的程序放进线程池内
多线程TCP客户端
# ----多线程TCP客户端----
from threading import Thread
import socket
c = socket.socket()
c.connect(("127.0.0.1", 8989))
def send_msg():
while True:
msg = input(">>>:")
if not msg:
continue
c.send(msg.encode("utf-8"))
send_t = Thread(target=send_msg)
send_t.start()
while True:
try:
data = c.recv(1024)
print(data.decode("utf-8"))
except:
c.close()
break