IT七剑客 IT七剑客
首页
wresource
郭霖
孤寒者
IT邦德
沉默王二
老麦
stackoverflow
GitHub (opens new window)
首页
wresource
郭霖
孤寒者
IT邦德
沉默王二
老麦
stackoverflow
GitHub (opens new window)
  • 基础python文章

    • 一篇万字博文带你入坑爬虫这条不归路
    • 使用scrapyd部署爬虫项目
    • scrapy_redis分布式爬虫的创建流程及启动
    • Scrapy实战之豆瓣top250电影信息的爬取
    • Scrapy框架初识
    • Python常用模块 之threading和Thread模块 第三阶段 线程池
      • 1.1 池的概念:
      • 1.2 自定义线程池:
      • 1.3 使用Python内置线程池:
      • 1.4 池的其他操作:
      • 👑有关于Me
    • Python常用模块 之 threading和Thread模块 第二阶段 线程通信及队列基操
    • Python常用模块 之 threading和Thread模块 第一阶段 线程的实现
    • Python简介&&开发环境配置&&工具准备
  • 前后端实战

  • Python面试

  • 孤寒者 Python
  • 基础python文章
孤寒者
2022-08-20
目录

Python常用模块 之threading和Thread模块 第三阶段 线程池

# 1. 线程池

# 1.1 池的概念:

在这里插入图片描述

  • 主线程: 相当于生产者,只管向线程池提交任务。 并不关心线程池是如何执行任务的。
  • 线程池: 相当于消费者,负责接收任务,并将任务分配到一个空闲的线程中去执行。并不关心是哪一个线程执行的这个任务。

# 1.2 自定义线程池:

# -*- coding: utf-8 -*-
"""
__author__ = 孤寒者
"""
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()
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45

在这里插入图片描述

# 1.3 使用Python内置线程池:

# -*- coding: utf-8 -*-
"""
__author__ = 孤寒者
"""
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('这是程序的最后一行,执行到这里,主线程结束')
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

在这里插入图片描述

# 1.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 对象并写入文件

# 🔆In The End!

# 👑有关于Me

个人简介:我是一个硬件出身的计算机爱好者,喜欢program,源于热爱,乐于分享技术与所见所闻所感所得。文章涉及Python,C,单片机,HTML/CSS/JavaScript及算法,数据结构等。

从现在做起,坚持下去,一天进步一小点,不久的将来,你会感谢曾经努力的你!

认真仔细看完本文的小伙伴们,可以点赞收藏并评论出你们的读后感。并可关注本博主,在今后的日子里阅读更多技术文哦~

作者:孤寒者 链接:https://juejin.cn/post/7108150041222578206 来源:稀土掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

#Python#孤寒者
上次更新: 2023/04/05, 05:23:58
Scrapy框架初识
Python常用模块 之 threading和Thread模块 第二阶段 线程通信及队列基操

← Scrapy框架初识 Python常用模块 之 threading和Thread模块 第二阶段 线程通信及队列基操→

最近更新
01
How the creator of Angular is dehydrating the web (Ep 574)
06-07
02
For those who just don’t Git it (Ep 573)
06-07
03
Modern work requires attention. Constant alerts steal it
06-07
更多文章>
Theme by Vdoing | Copyright © 2022-2024 IT七剑客 | MIT License
  • 闽ICP备2021006579号-4
  • 闽公网安备 35012102500470号
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式