首页 > 系统相关 >python 多线程, 多进程, ProcessPoolExecutor. 有关GIL锁的问题实验.

python 多线程, 多进程, ProcessPoolExecutor. 有关GIL锁的问题实验.

时间:2023-03-08 12:45:33浏览次数:50  
标签:ProcessPoolExecutor multi 多线程 序列化 list add time GIL def

import time
import threading
from multiprocessing import Process
from concurrent.futures import ProcessPoolExecutor

def time_decorator(func):

    def wrapper(*args, **kwargs):
        now = time.time()
        func(*args, **kwargs)
        print(time.time() - now)
    return wrapper


def add():
    for i in range(100000000):
        pass

@time_decorator
def multi_threading():

    t_list = []
    for i in range(10):
        t = threading.Thread(target=add)
        t_list.append(t)

    for t in t_list:
        t.start()

    for t in t_list:
        t.join()

@time_decorator
def multi_processing():

    t_list = []
    for i in range(10):
        t = Process(target=add)
        t_list.append(t)

    for t in t_list:
        t.start()

    for t in t_list:
        t.join()

@time_decorator
def future_multi_processing():
    """
    父子进程, 平行运行多个GIL解释器.
    父子进程, 通信通过Pickle序列化及本地套接字(local socket), 序列化和反序列化, 开销较大.
    没有任何附加信息进程间通信
    """
    r_list = []
    pool = ProcessPoolExecutor(max_workers=10)
    for i in range(10):
        t = pool.submit(add)
        r_list.append(t)
    pool.shutdown()


@time_decorator
def add_total():
    for i in range(100000000 * 10):
        pass

if __name__ == "__main__":

    multi_threading()
    multi_processing()
    future_multi_processing()
    add_total()

29.84246516227722 # 多线程
14.255790710449219 # 多进程
13.782246112823486 # futures.ProcessPoolExecutor
父子进程, 平行运行多个GIL解释器.
父子进程, 通信通过Pickle序列化及本地套接字(local socket), 序列化和反序列化, 开销较大.
没有任何附加信息进程间通信
26.558323860168457 # 正常执行

标签:ProcessPoolExecutor,multi,多线程,序列化,list,add,time,GIL,def
From: https://www.cnblogs.com/dsdr/p/17191633.html

相关文章

  • 这里是Sigil Lau的一片自留地,用于和New Bing的对话。不会有技术或者其他有价值的内容
    片名:因特琳斯(intelligence音译),或者可以叫“数字生命”?人物:小男孩乐乐(名字暂定),AI琳斯,乐乐的妈妈 一、故事梗概 八岁男孩乐乐的妈妈在车祸中去世,留下了自己的研发成果......
  • 多线程设计模式-全面详解(学习总结---从入门到深化)
    目录​​SingleThreadExecution设计模式​​​​机场过安检​​​​ 非线程安全​​​​ 问题分析​​​​首字母相同却未通过检查​​​​为何出现首字母不相同的情况......
  • C# 多线程(Thread和Task)
    C#多线程(Thread和Task)线程(Thread)是进程中的基本执行单元,是操作系统分配CPU时间的基本单位,一个进程可以包含若干个线程,在进程入口执行的第一个线程被视为这个进......
  • Edge 多线程下载+立即下载
    开启多线程下载打开新标签页,在地址栏里输入:edge://flags/#enable-parallel-downloading选择Enabled立即下载(关闭文件扫描)打开新标签页,在地址栏里输入:edge://settin......
  • [WPF]C#连接使用sqllite数据库,,支持多线程操作
    https://www.zhaokeli.com/article/8192.html项目开发环境win764vs2015.net4.6下载  System.Data.SQLite.dll-for-.net4.0.zip  引用到项目中使用sqllite扩展的......
  • 多线程
    多线程概念程序为了完成某个任务或功能,选择某个编程语言而编写的一组代码指令的集合进程程序的一次运行,是操作系统管理和调度的最小单位,每一个进程之间内存是......
  • 使用python多线程检测ip地址
    #检测得ip地址在C:\Users\admin\Desktop\iplist.txt文件中importsubprocessimportthreadingimportIPyimportrefromqueueimportQueueimporttimeip_use=[]#检......
  • java多线程分析
    在java多线程中编程中,异常处理非常重要,会影响应用程序的整体运行情况。1、线程中可以捕捉的异常我们在普通的方法中,是支持exception往上层throw,简单来说,就是当前逻辑不......
  • JAVA多线程(四)--锁的定义
    一、乐观锁乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低,每次拿数据时都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这......
  • Spring Boot @Scheduled 是同步还是异步,单线程还是多线程?
    @schedule刚开始用的时候回遇到一些坑,主要就是他的同步、异步、多线程的配置问题,这篇文章介绍了@schedule的使用方法,读者遇到问题时可以参考下。1.问题@schedule注解默......