线程/进程池--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

 

posted @ 2019-01-03 15:02  WenChen-0o0  阅读(95)  评论(0编辑  收藏  举报