python之进程池和线程池_小猪的互联网江湖的博客-程序员信息网

技术标签: 并发  python  PyCharm  python爬虫  多线程  进程池  Python进阶之路  线程池  

进程池和线程池

1.可以重复利用的线程

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2018/10/16 18:19
# @Author  : DoubleChina
# @Site    : 
# @File    : PoolTest.py
# @Software: PyCharm
import threading
import queue


class MyThread(threading.Thread):
    def __init__(self):
        super().__init__()
        self.queue = queue.Queue()
        # 触发等待机制,随着主线程一起退出
        self.daemon = True
        # 实例化的时候就直接启动线程
        self.start()

    def run(self):
        # 无限循环,不停执行任务
        while True:
            # 获取任务与参数
            func, args, kwargs = self.queue.get()  # 获取任务,在执行
            # 执行任务
            func(*args, **kwargs)
            # 告诉queue这个任务处理完毕
            self.queue.task_done()

    def apply_async(self, func, args=(), kwargs={}):  # 接受任务
        # 向队列中提交任务
        self.queue.put((func, args, kwargs))

    def join(self, timeout=None):  # 等待所有提交的任务执行完毕
        # 其实是问queue,任务是否执行完毕
        self.queue.join()


def func1():
    print('func1')


def func2():
    print('func2')


t = MyThread()
t.apply_async(func=func1)
t.apply_async(func=func2)
t.join()
# 1.

2.线程池的简单实现

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

自定义一个线程池

import threading
import queue
import time


class Worker(threading.Thread):
    def __init__(self, queue):
        super().__init__()
        self.queue = queue
        # 触发等待机制,随着主线程一起退出
        self.daemon = True
        self.start()

    def run(self):
        # 无限循环,不停执行任务
        while True:
            # 获取任务与参数
            func, args, kwargs = self.queue.get()  # 获取任务,在执行  # 执行任务
            func(*args, **kwargs)
            # 告诉queue这个任务处理完毕
            self.queue.task_done()

    def join(self, timeout=None):  # 等待所有提交的任务执行完毕
        # 其实是问queue,任务是否执行完毕
        self.queue.join()


class MyPool(object):
    def __init__(self, num):
        self.num = num
        self.queue = queue.Queue()
        for i in range(num):
            Worker(self.queue)

    def apply_async(self, func, args=(), kwargs={}):  # 接受任务
        # 向队列中提交任务
        self.queue.put((func, args, kwargs))

    def join(self):
        self.queue.join()


def func1():
    print(threading.current_thread().getName())
    time.sleep(2)


def my_pool_test():
    start_time = time.time()
    t = MyPool(3)  # 实例一个线程池
    for i in range(4):
        t.apply_async(func=func1)
    t.join()
    print('运行时间是{}秒'.format(time.time() - start_time))

3.Python自带的池


# 线程池
from  multiprocessing.pool import ThreadPool
# 进程池
from multiprocessing import Pool
import time
import random

# 可能是一个请求的函数
def worker(msg):
    time.sleep(2)
    # t_start = time.time()
    # data = random.randint(0, 9)
    print(msg)

def test_thread_pool():  # 线程池测试
    msg_list = [1, 2, 3, 4, 5]

    # 实例化一个线程池,2是线程的数量
    pool = ThreadPool(2)

    # map会把系列里面的元素依次传入前面的方法
    # pool.map(worker, msg_list)
    # 放入一个线程
    pool.apply_async(worker, args='1')
    # join之前 关闭线程池,不在提交任务,否则调用join会报错
    pool.close()
    # 等待线程池里面的任务运行完毕
    pool.join()

def test_process_pool():  # 进程池测试
    # 进程池
    process_pool = Pool()
    # process_pool.apply_async(worker, args=(2,))
    msg_list = [1, 2, 3, 4, 5]
    # map_async 放入一个集合,把任务丢给进程池,加了async之后就不会等待运行结束,主进程退出,所有进程结束
    process_pool.map_async(worker, msg_list)
    # 使用map会进行阻塞
    # process_pool.map(worker, msg_list)
    # process_pool.close()
    # process_pool.join()
    print('tttt')

if __name__ == '__main__':
    # test_thread_pool()
    test_process_pool()

4.使用池来实现并发Socket服务器


# 线程池并发编程
from  multiprocessing.pool import ThreadPool
import socket

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


def reable(conn):
    while True:
        recv_data = conn.recv(1024)
        if recv_data:
            print(recv_data)
            conn.send(recv_data)
        else:
            conn.colse()
            break


def socket_thread_pool():
    print('服务端已经启动')
    pool = ThreadPool(2)
    while True:
        conn, addr = server.accept()
        print('客户端{}已经连接'.format(addr))
        pool.apply_async(reable, args=(conn,))

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lianjiaokeji/article/details/83152012

智能推荐

一套完整的unity的socket网络通信模块_unity 网络通信_刘峰1011的博客-程序员信息网

这里只讲一些主要内容,完整代码请到我的github里下载:https://github.com/LiuFeng1011/UnityNetWork/tree/master/Assets/Code/NetSocketHelper类主要的通信类,socket的管理放在这里下面说一下一些主要的方法1.连接服务器,这个都写了比较详细的注释,一看就会明白 ///

计算机组成原理复习_计算机组成pc+1的位置不同 贴吧_南木Sir的博客-程序员信息网

计算机组成原理考试题型-·计算机组成原理期末考试试题及答案·计算机组成原理考试重点

shell启动java程序_使用shell脚本运行java程序_泓坊河畔的博客-程序员信息网

(题外话: 其实我也是刚学怎么编写shell脚本,可能写得有不好的地方,多多见谅)平时我们编写完java程序后,运行调试都是ide帮我们弄好的,但是实际情况肯定不会用ide运行,而是打包成jar,用命令行执行命令来运行程序,所以本着项目部署的方便,我就写了个shell脚本.首先,来解释下这个shell脚本需要用到的知识:首先是这行代码#!/bin/sh这行代码表示这个脚本使用/bin/sh这个目录...

搞懂JavaScript异步请求,一篇文章就够了_js异步请求是什么_沸羊羊_的博客-程序员信息网

javascript 语言执行环境是单线程,就是一次只能完成一个任务,如果同时有多个任务,必须排队执行。这种模式的好处是实现较简单,执行环境单纯,缺点是只要有一个任务耗时长,后面的任务必须排队,拖延整个程序的执行效率。

STM32-ADC学习-HAL库(基础篇)_stm32 adc hal_七 六 伍的博客-程序员信息网

STM32CubeMX配置ADCs_Common_Settings(ADC基础设置)  Mode(工作模式)Independent mode(独立模式):在同一引脚上仅有一个ADC在采集模拟信号ADC_Settings(ADC设置)  Data Alignment(数据对齐)Right alignment(数据右对齐)、Left alignment(数据左对齐)Scan Conversion Mode(扫描模式)ENABLE(使能)、DISABLE(禁止)#当有多个通道需要采集信号时必须

vue 部门tree样式_Vue组件tree实现树形菜单_麦文学的博客-程序员信息网

这篇文章主要为大家详细介绍了Vue组件tree实现树形菜单,具有一定的参考价值,可以用来参考一下。感兴趣的小伙伴,下面一起跟随512笔记的小编两巴掌来看看吧!vue 编写的树形菜单,小巧实用,支持vue1.0,vue2.0v1.0 功能:1.支持多级树目录2.支持高亮点击的节点3.支持展开点击节点4.支持点击收缩节点时收缩所有子目录5.支持自定义回调函数,点击节点时回调,参数为节点信息用法:代码如...

随便推点

解决微信支付返回"签名错误"问题总结_houxiaolu1989的博客-程序员信息网

微信支付总是"签名错误"问题,API_KEY也都对 最近总是有些微信商户号在支付的时候报"签名错误",用微信自带的签名校验工具检验签名也是正常的同样的方法有些账号就是可以的,有些就是不行,这就是微信的坑,大家一定要注意,稍有不慎就入坑了,废话不多说,直接上原因: 首先要确保提交的参数什么的都对的情况下适用于我说的这种情况,**重点来了:::**微信在商户平台配置API_KEY时这里有漏...

h3c交换机配置nat_H3C NAT配置实例_也许我有一克拉的博客-程序员信息网

H3C NAT配置:1、 配置静态地址转换:一对一静态地址转换:[system] nat static ip-addr1 ip-addr2静态网段地址转换: [system] nat static net-to-net inside-start-address inside-end-address global global-address mask应用到接口: [inte...

使用 apache2 + `mod_proxy_uwsgi` + uwsgi + upstart 部署_weixin_30485799的博客-程序员信息网

使用 apache2 + mod_proxy_uwsgi + uwsgi + upstart 部署网上运行 python wsgi 的应用时,大部分的资料都是使用 nginx 、uwsgi ,很少资料提及到 apache2 下如何进行处理。但是平时的部署环境其实很难跳过 apache2 ,很多环境已经带 apache2 ,不好另外安装一个 nginx ,因此,经过一番测试后,建议使用 apach...

signal 信号列表 (kill -l)_king16304的博客-程序员信息网

SIGNAL(7)                      Linux Programmer's Manual                      SIGNAL(7) NAME       signal - 有效信号的清单描       下面 列出 Linux 支持的 信号. 某些 信号 依赖于 体系结构(architecture).      

MFC ComboBox 和 Edit_weixin_30437481的博客-程序员信息网

初始化: 1 void CaftdemoDlg::InitComb() 2 { 3 CString classifty[] = {"大于","大于等于","等于","小于","小于等于","不等于"}; 4 int HideInt[6] = {1,5,4,2,6,8}; 5 6 for (int i = 0;i < 6; ++i...

ubuntu14.04&&Python 3.6.x&&Django2.2.6安装_安装django2.2.6_默行默致的博客-程序员信息网

ubuntu14.04&&Python 3.6.x&&Django2.2.6安装安装openssl下载python源码包Python-3.6.9.tgz解压、编译、安装Python-3.6.9.tgz安装pip安装Django~~虚拟环境安装Django~~安装opensslapt-get install openssl libcurl4-openssl-dev...

推荐文章

热门文章

相关标签