1.可重复利用的线程
from threading import Thread
from queue import Queue
import time,random
class MyThread(Thread):
def __init__(self,queue):
super().__init__()
self.queue = queue
self.start()
def run(self):
while True:
func,args= self.queue.get()
func(*args)
self.queue.task_done()
def task(info):
print(info)
time.sleep(3)
if __name__ == '__main__':
queue = Queue()
for i in range(6):
queue.put((task,(random.randint(1,100),)))
for i in range(4):
t = MyThread(queue)
2.简单线程池
from threading import Thread
from queue import Queue
import time, os
class Pool(object):
def __init__(self, num):
if num is None:
num = os.cpu_count() * 2 or 1
if num < 1:
raise ValueError("子线程的数量最少是1")
self.num = num
self.queue = Queue()
for i in range(self.num):
t = Thread(target=self.job,daemon = True)
t.start()
def job(self):
while True:
func, args, kwargs = self.queue.get()
func(*args, **kwargs)
self.queue.task_done()
def join(self):
self.queue.join()
def apply_asyc(self, func, args=(), kwargs=None):
if kwargs is None:
kwargs = {}
self.queue.put((func, args, kwargs))
def task(attr):
print(attr)
time.sleep(3)
print('%s号任务完成' %attr)
if __name__ == '__main__':
pool = Pool(4)
for i in range(4):
pool.apply_asyc(task, args=(i,))
pool.join()
print('主进程结束')
3.python线程池
from threading import Thread
from queue import Queue
import time, random
class MyThread(Thread):
def __init__(self, queue):
super().__init__()
self.daemon = True
self.queue = queue
self.start()
def run(self):
while True:
func, args = self.queue.get()
func(*args)
self.queue.task_done()
def task(info):
print(info)
time.sleep(3)
if __name__ == '__main__':
queue = Queue()
for i in range(8):
queue.put((task, (random.randint(1, 100),)))
for i in range(4):
t = MyThread(queue)
queue.join()
3.python进程池
from multiprocessing import Pool
使用同线程池
实现并发服务器:
from multiprocessing import Pool
import socket
def task(sock):
while True:
r_data = sock.recv(1024)
if r_data:
sock.send(r_data)
print(r_data.decode('utf-8'))
else:
sock.close()
break
if __name__ == '__main__':
pool = Pool(8)
server = socket.socket()
server.bind(('',8080))
server.listen(1000)
while True:
conn,addr = server.accept()
pool.apply_async(task,args=(conn,))