Python线程池
孤寒者 人气:71. 池的概念
主线程:
相当于生产者,只管向线程池提交任务。 并不关心线程池是如何执行任务的。
线程池:
相当于消费者,负责接收任务,并将任务分配到一个空闲的线程中去执行。并不关心是哪一个线程执行的这个任务。
2. 自定义线程池
# -*- coding: utf-8 -*- from threading import Thread from queue import Queue import time class ThreadPool: # 初始化 def __init__(self, n): self.queue = Queue() for i in range(n): # 创建线程 Thread(target=self.worker, daemon=True).start() #daemon是开启守护线程 # 执行任务 def worker(self): while True: func, args, kwargs = self.queue.get() func(*args, *kwargs) self.queue.task_done() # 获取任务,将任务添加到队列中 def apply_async(self, target, args=(), kwargs={}): self.queue.put((target, args, kwargs)) # 阻塞 def join(self): self.queue.join() def fun(x): print('爱孤寒者 第%s次' % x) time.sleep(3) print('帅哥美女就关注同名微信公众号【孤寒者】啦~') # 开两个线程 t = ThreadPool(2) # 提交10个任务 for i in range(10): t.apply_async(fun, args=(i,)) t.join()
3. 使用Python内置线程池
# -*- coding: utf-8 -*- from multiprocessing.pool import ThreadPool import time pool = ThreadPool(2) # 创建两个线程 def funa(x, y): print('%s好好学习' % x) time.sleep(3) print('天天向上') def funb(x, y): print('%shello' % x) time.sleep(3) print('world') # 我们这就是有一个线程池,里面有两个等待处理任务的线程,然后这两个函数就是两个任务, # 线程池里一个线程处理一个,所以会同时输出!如果多于两个任务就会执行等待sleep pool.apply_async(funa, args=('我们要————', 2)) # 将任务添加到线程池 pool.apply_async(funb, args=('大家要————', 4)) pool.close() # close之后则无法向线程池提交任务 # 内置线程池,自带守护线程,主线程结束,子线程也跟着结束 # 所以需要加阻塞,否则主线程一结束,子线程也跟着结束,无输出 pool.join() # 在join之前可使用终止线程,直接终止线程pool: pool.terminate() print('这是程序的最后一行,执行到这里,主线程结束')
4. 池的其他操作
操作一: close - 关闭提交通道,不允许再提交任务;
操作二: terminate - 中止进程池,中止所有任务 。
拓展: JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写。 是用来存储和交换文本信息的语法。
数据在名称/值对中 数据由逗号分隔 大括号保存对象 中括号保存数组
使用 JSON 函数需要导入 json 库:import json。
json,用于字符串 和 python数据类型间进行转换json模块提供了四个功能:dumps、dump、loads、load
- 1.json.dumps 将 Python 对象编码成 JSON 数据
- 2.json.dump 将 JSON 数据通过特殊的形式转换为只有 Python 认识的字符串并写入文件
- 3.json.loads 将已编码的 JSON 数据解码为 Python 对象
- 4.json.load 将一个包含 JSON 格式数据的可读文件解码为一个 Python 对象并写入文件
加载全部内容