首页 > 系统相关 >进程池与线程池

进程池与线程池

时间:2022-11-21 20:45:49浏览次数:45  
标签:__ task print 线程 time 进程 import

进程和线程是不可以无限制的创建
因为硬件的发展赶不上软件,有物理极限,如果我们在编写代码的过程中无限制的创建进程或者线程会导致计算机崩溃

池
	降低程序的执行效率,但是保证了计算机硬件的安全
进程池
	提前创建好固定数量的进程供后续程序的调用,超出则等待
线程池
	提现创建好固定数量的线程供后续程序的调用,超出则等待
    
'创建线程(进程)池'
from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor
import os
import time
import random
from threading import current_thread

# 1.产生含有固定数量线程的线程池
pool = ThreadPoolExecutor(10)  # 创建固定10个线程的线程池
pool1 = ProcessPoolExecutor(5)  # 固定5个进程的进程池


def task(n):
    print('task is running')
    time.sleep(random.randint(1, 3))
    print('task is over', n, current_thread().name)
    return '我是task函数的返回值'


def func(*args, **kwargs):
    print('from func')


if __name__ == '__main__':
    # 直接将任务提交给线程池久远可以了
    for i in range(20):
        pool.submit(task, 123).add_done_callback(func)
        # 这句话表示将函数task函数提交给线程池,然后获取的返回值直接作为参数传入func函数,执行,这样必须一个进程或者线程执行完毕task函数之后才可以执行func

携程

"""
进程:资源单位
线程:执行单位
携程:单线程下实现并发(效率极高)
	  在代码层面欺负CPU,让CPU认为我们的代码里面没有IO操作
	  实际上IO操作被我们自己写的代码检测,一旦有,立刻让代码		执行别的
	  核心:自己写的代码完成切换+保存状态
"""
import time
from gevent import monkey;

monkey.patch_all()  # 固定编写 用于检测所有的IO操作(猴子补丁)
from gevent import spawn


def func1():
    print('func1 running')
    time.sleep(3)
    print('func1 over')


def func2():
    print('func2 running')
    time.sleep(5)
    print('func2 over')


if __name__ == '__main__':
    start_time = time.time()
    # func1()
    # func2()
    s1 = spawn(func1)  # 检测代码 一旦有IO自动切换(执行没有io的操作 变向的等待io结束)
    s2 = spawn(func2)
    s1.join()
    s2.join()
    print(time.time() - start_time)  # 8.01237154006958   协程 5.015487432479858

携程实现并发

import socket
from gevent import monkey;monkey.patch_all()  # 固定编写 用于检测所有的IO操作(猴子补丁)
from gevent import spawn


def communication(sock):
    while True:
        data = sock.recv(1024)
        print(data.decode('utf8'))
        sock.send(data.upper())


def get_server():
    server = socket.socket()
    server.bind(('127.0.0.1', 8080))
    server.listen(5)
    while True:
        sock, addr = server.accept()  # IO操作
        spawn(communication, sock)

s1 = spawn(get_server)
s1.join()

如何不断的提升程序的运行效率
	多进程下开多线程 多线程下开协程

标签:__,task,print,线程,time,进程,import
From: https://www.cnblogs.com/zhanghong1229/p/16913130.html

相关文章

  • python之路32 网络并发线程方法 线程池 协程
    多进程实现TCP服务端并发服务端:importsocketfrommultiprocessingimportProcessdefget_server():server=socket.socket()server.bind(('127.0.0.1'......
  • 进入python的世界_day35_网络编程——线程相关知识、GIL锁,互斥锁、event事件、池子、
    上周五作业——多进程实现TCP服务端并发#服务端importsocketfrommultiprocessingimportProcessdefget_server():server=socket.socket()server.bi......
  • 互斥锁、线程
    今日内容概要多进程实现TCP服务端并发互斥锁代码实操线程理论创建线程的多种方式线程join方法守护线程线程诸多方法GIL全局解释器锁今日内容详情多进程实......
  • 并发编程3 线程
    多进程实现TCP服务端并发importsocketfrommultiprocessingimportProcessdefget_server():server=socket.socket()server.bind(('127.0.0.1',8081)......
  • C# 简单实现线程池
    NET6环境开发 实现线程数量,任务队列,非核心线程,及核心线程活跃时间的管理。namespaceCustomThreadPool;///<summary>///线程池类///</summary>publicclassT......
  • 多线程与线程池知识点
    多线程https://www.cnblogs.com/empty-me/p/15664024.htmlJava多线程:向线程传递参数的三种方法......
  • 线程理论
    今日内容详细互斥锁代码实操锁:建议只加载操作数据的部分否则整个程序的效率会很低defsearch(name):withopen(r'joyce.txt','r',encoding='utf8')asf:......
  • 多进程实现TCP服务端并发、互斥锁、线程及代码实现、GIL全局解释器锁、信号量、event
    目录一、多进程实现TCP服务端并发二、互斥锁代码实操1、互斥锁的概念2、互斥锁的使用3、死锁现象4、小结三、线程理论进程线程线程简介为什么要使用多线程?多线程概念多进......
  • C#中多线程的使用(3)async/awaite
    一、简介在这最后一部分,记录一下async/awaite这一组关键字的用法,async/await这一组关键字是在.netframework4.5开始才有的,async是用来修饰方法,await用于方法内部等待......
  • 线程
    线程线程理论进程进程其实是资源单位,表示的是一块内存空间线程线程是执行单位,表示真正的代码指令一个进程内部至少含有一个线程1.一个进程内可以开设多个......