Python3之网络编程总结

xiaoxiao2021-02-28  101

重中之重

进程池、线程池

from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor import time def task(n): time.sleep(2) return n ** 2 def deal_result(ret): # print(ret) ret = ret.result() print(ret) if __name__ == '__main__': # p = ProcessPoolExecutor() p = ThreadPoolExecutor() # 默认20线程 p_list = [] # obj = p.map(task, range(10)) # print(list(obj)) for i in range(10): obj = p.submit(task, i).add_done_callback(deal_result) p_list.append(obj) p.shutdown() print([i.result() for i in p_list])

生产者消费者模型

进程实现消费者生产者模型

from multiprocessing import Process, JoinableQueue import time import multiprocessing q = JoinableQueue() def consumer(q): while 1: res = q.get() time.sleep(2) print('消费者消费了%s' % res) q.task_done() def producer0(q): for i in range(5): q.put(i) print('生产者生产了%s' % i) q.join() def producer1(q): for i in range(5): q.put(i) print('生产者生产了%s' % i) q.join() if __name__ == '__main__': p1 = Process(target=producer0, args=(q,)) p2 = Process(target=producer1, args=(q,)) p3 = Process(target=consumer, args=(q,)) p3.daemon = True p1.start() p2.start() p3.start() p1.join() p2.join()

线程实现生产者消费者模型

from threading import Thread import queue import time q = queue.Queue() def consumer(): while 1: res = q.get() time.sleep(2) print('消费者消费了%s' % res) q.task_done() def producer0(): for i in range(5): q.put(i) print('生产者0000生产了%s' % i) q.join() def producer1(): for i in range(5): q.put(i) print('生产者1111生产了%s' % i) q.join() if __name__ == '__main__': t1 = Thread(target=consumer,) t2 = Thread(target=producer0,) t3 = Thread(target=producer1,) t1.daemon = True t1.start() t2.start() t3.start() t2.join() t3.join()

回调函数

任务必须要有返回值以供回调函数调用,在add_done_callback中处理数据要先在任务中调用ret.result()将数据获取到~

from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor import time def task(n): time.sleep(2) return n ** 2 def deal_result(ret): # print(ret) ret = ret.result() print(ret) if __name__ == '__main__': # p = ProcessPoolExecutor() p = ThreadPoolExecutor() # 默认20线程 p_list = [] # obj = p.map(task, range(10)) # print(list(obj)) for i in range(10): obj = p.submit(task, i).add_done_callback(deal_result) p_list.append(obj) p.shutdown() print([i.result() for i in p_list])

Queue

from multiprocessing import Process, JoinableQueue import time import multiprocessing q = JoinableQueue() def consumer(q): while 1: res = q.get() time.sleep(2) print('消费者消费了%s' % res) q.task_done() def producer0(q): for i in range(5): q.put(i) print('生产者生产了%s' % i) q.join() def producer1(q): for i in range(5): q.put(i) print('生产者生产了%s' % i) q.join() if __name__ == '__main__': p1 = Process(target=producer0, args=(q,)) p2 = Process(target=producer1, args=(q,)) p3 = Process(target=consumer, args=(q,)) p3.daemon = True p1.start() p2.start() p3.start() p1.join() p2.join()

进程池线程池不能用Queue,如果想用,请参考下面的博客: Python3之无法在进程池中使用队列Queue的解决方案


转载请注明原文地址: https://www.6miu.com/read-64734.html

最新回复(0)