进程池和线程池

线程池

预先创建好一个数量较为优化的线程组,在需要的时候立刻能够使用,就形成了线程池。就像生产者消费者模型那样,主线程就像生产者一样,他会不断地的向池中提交任务,而并不关心池的内部是如何执行的以及哪一个子线程来执行任务。线程池中的线程就相当于消费者,他会不断地接受任务并将任务分派给空闲的线程去执行。

来看例子。

import threading
import queue
import time
class MyThreadPool:
    def __init__(self,maxSize):
        self.maxSize=maxSize
        self._pool=queue.Queue(maxSize)
        for _ in range(maxSize):
            self._pool.put(threading.Thread)
    def getThread(self):
        return  self._pool.get()
    def addThread(self):
        self._pool.put(threading.Thread)
def run(i,pool):
    print("执行任务",i)
    time.sleep(1)
    pool.addThread()
if __name__ == '__main__':
    pool=MyThreadPool(5)
    for i in range(20):
        t=pool.getThread()
        obj=t(target=run,args=(i,pool))
        obj.start()
    print("活动的子线程:",threading.active_count()-1)

以上代码的性能并不优化,实际设计还需要考虑的更多。

python中自带的池

线程池

from multiprocessing.pool import ThreadPool
import time
def task_one():
    time.sleep(1)
    print("任务一完成!")
def task_two():
    time.sleep(1)
    print("任务二完成!")

pool=ThreadPool(2)
pool.apply_async(task_one)
pool.apply_async(task_two)
print("任务提交完成!")

pool.close()#在join之前必须关闭,不允许再向池中提交任务
pool.join()
print("任务完成!")

进程池

from multiprocessing import Pool
import time
def task_one():
    time.sleep(1)
    print("任务一完成!")
def task_two():
    time.sleep(1)
    print("任务二完成!")

if __name__ == '__main__':
    pool=Pool(2)
    pool.apply_async(task_one)
    pool.apply_async(task_two)
    print("任务提交完成!")
    pool.close()
    pool.join()
    print("任务完成!")

线程池实现并发服务器

from multiprocessing.pool import ThreadPool
import socket

server=socket.socket()
server.bind(('0.0.0.0',9999))
server.listen()

def worker(connection):
    while True:
        recv_data=connection.recv(1024)
        if recv_data:
            print("接收到数据:",recv_data)
            connection.send(recv_data)
        else:
            connection.close()
            break

if __name__ == '__main__':
    pool=ThreadPool(4)
    while True:
        conn,addr=server.accept()
        pool.apply_async(worker,args=(conn,))
import socket
client=socket.socket()
client.connect(('0.0.0.0',9999))
while True:
    data=input("请发送数据:")
    client.send(data.encode())
    print("收到回送数据:",client.recv(1024).decode())

进程池+线程池实现并发服务器

from multiprocessing.pool import ThreadPool
from multiprocessing import Pool
import socket
import os

server=socket.socket()
server.bind(('0.0.0.0',9999))
server.listen()

def worker(connection):
    while True:
        recv_data=connection.recv(1024)
        if recv_data:
            print("接收到数据:",recv_data)
            connection.send(recv_data)
        else:
            connection.close()
            break
def worker_process(server):
    thread_pool=ThreadPool(os.cpu_count()*2)#分配2倍CPU的进程
    while True:
        coon,addr=server.accept()
        thread_pool.apply_async(worker,args=(coon,))

if __name__ == '__main__':
    n=os.cpu_count()
    process_pool=Pool(n)
    for i in range(n):
        process_pool.apply_async(worker_process,args=(server,))
    process_pool.close()
    process_pool.join()
import socket
client=socket.socket()
client.connect(('0.0.0.0',9999))
while True:
    data=input("请发送数据:")
    client.send(data.encode())
    print("接收到数据",client.recv(1024).decode())

猜你喜欢

转载自www.cnblogs.com/austinjoe/p/9691542.html