线程/进程池--day35
"""
----线程/进程池----
与信号量的区别 ,信号量也是一种锁 适用于保证同一时间能有多少个进程或线程访问
而线程/进程池,没有对数据访问进行限制仅仅是控制数量
"""
创建线程池
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