Python的多线程和多进程模块对比测试

本文主要对比测试Python的多线程和多进程模块在CPU类型和I/O的任务操作时的效率

一 测试CPU消耗类型任务

在一台多核CPU的服务器上执行多线程代码,理论上代码执行时会利用多余的CPU核心来提升性能。但是由于Python的GIL的存在,使用多线程来执行CPU繁重的任务,未必能得到性能提升。但是GIL又必不可少,因为在Python解释器中执行线程是不安全的,也就是说为了保证Python线程执行时的安全,Python提供了一个全局锁,同一时刻,只允许一个线程获得这个全解锁并执行。

CPU消耗类型任务

def f(n):
    list=[]
    for x in range(n):
        x=x*x
        list.append(x)

1.单个线程测试

#!/usr/sbin/python
import threading

def f(n):
    list=[]
    for x in range(n):
        x=x*x
        list.append(x)

if __name__ == ‘__main__‘:
   threads=2
   tasks=[]
   for i in range(1,threads):
      thread=threading.Thread(target=f(10000000))
      tasks.append(thread)
   for j in tasks:
      j.start()
   for j in tasks:
      j.join()
real	0m4.965s
user	0m4.104s
sys	0m0.797s

使用单线程执行时间大约为4.9秒

2.使用2个线程

设置 threads=3

real	0m8.469s
user	0m7.480s
sys	0m0.981s

使用两个线程执行以上任务,性能反而下降了很多

3.使用4个线程

设置 threads=5

real	0m16.016s
user	0m14.712s
sys	0m1.285s

4.使用8个线程

设置 threads=9

real	0m31.374s
user	0m29.231s
sys	0m2.108s

通过以上测试可以得知,使用Python的多线程模块,线程数越多,执行CPU消耗类型的任务时,效率越低。

5.单个进程测试

参考文档:

https://www.quantstart.com/articles/parallelising-python-with-threading-and-multiprocessing

时间: 2024-10-10 06:27:58

Python的多线程和多进程模块对比测试的相关文章

Python的多线程与多进程实践

最近要产生大量的”假“的电话号码,所以就写了一个自动产生电话号码程序,产生了一百万条数据,然后把数据放到一个文件中. 死跑版: # -*- coding: utf-8 -*- # 以下是中国的手机号码分段情况 # 新联通 (中国联通+中国网通)手机号码开头数字 130.131.132.145. # 155.156.185.186 # 新移动 (中国移动+中国铁通)手机号码开头数字 134.135.136.137. # 138.139.147.150.151.152.157.158.159.182

python socket多线程和多进程

在socket中,如果直接创建的话,是只能接受一个用户的请求需要实现socketserver中的handle方法,可以实现多进程并发访问 SocketServer内部使用 IO多路复用 以及 "多线程" 和 "多进程" ,从而实现并发处理多个客户端请求的Socket服务端.即:每个客户端请求连接到服务器时,Socket服务端都会在服务器是创建一个"线程"或者"进 程" 专门负责处理当前客户端的所有请求. 1.创建一个继承自 s

python的多线程和多进程

要使用Python的多线程,首先要了解一个概念.GIL(global interpreter lock),翻译过来就是以解释器为单位的全局锁. 用过线程锁的都知道,LOCK就是用来管理住线程,让一个指定的线程先运行,其他的先暂停(等待),避免线程的混乱,尤其是在共用变量的情况下. GIL也是一样的概念,但是不同的是: 1.你可以想成他是解释器控制的 2.线程的指定是随机的 3.每个线程acquire运行机会后,可运行的内容很少(因此线程间的切换超级快) 因此,多线程看起来好像是多个线程一起运行,

python中多线程,多进程,队列笔记(一)

threading简介:If you want your application to make better use of the computational resources of multi-core machines, you are advised to use multiprocessing. However, threading is still an appropriate model if you want to run multiple I/O-bound tasks si

python之多线程与多进程

1. 多进程与多线程 (1)背景:为何需要多进程或者多线程:在同一时间里,同一个计算机系统中如果允许两个或者两个以上的进程处于运行状态,这便是多任务.多任务会带来的好处例如用户边听歌.边上网.边打印,而这些任务之间丝毫不会互相干扰.使用多进程技术,可大大提高计算机的运算速率. (2)多进程与多线程的区别: 进程:程序在计算机上的一次执行活动.进程分为:系统进程和用户进程. 当运行一个程序时,实际就是启动了一个进程.程序是死的(静态的),进程是活的(动态的). 线程:是程序中的一个单一的顺序控制流

python的多线程、多进程代码示例

多线程有两种方式:thread和threading 这里应用的场景是map数据分多线程.进度写入codis的示例 这是thread的示例:thread的主进程不会等待线程 import thread,math,threading,multiprocessing,os,time def writeToCodis(prefix,key_list,result_map): # client = BfdCodis("xxx", ) begin = int(time.time()) for ke

Python之多线程:Threading模块

1.Threading模块提供的类 Thread,Lock,Rlock,Condition,Semaphore,Event,Timer,local 2.threading模块提供的常用的方法 (1)threading.currentThread(): 返回当前的线程变量. (2)threading.enumerate(): 返回一个包含正在运行的线程的list.正在运行指线程启动后.结束前,不包括启动前和终止后的线程. (3)threading.activeCount():返回正在运行的线程数量

基于Python的多线程与多进程

1.I/O密集型与计算密集型 多进程适用于I/O密集型 多进程适用于计算密集型 2.没有sleep(T)的多个死循环只能用多进程 3.模块介绍: 1)threading模块(_thread模块已淘汰)示例: 运行结果: 2)multiprocessing 模块演示: 代码结果: 3) concurrent.futures模块 执行结果: 原文地址:https://www.cnblogs.com/cepaAllium/p/11528994.html

python的多线程编程 --- thread模块

1.使用thread模块(不推荐) 常用函数: 'start_new_thread(function,args,kwargs=None)':创建一个新的线程,并运行'function(args)' 'allocate_lock()': 创建锁对象 Lock object 'exit()': 提示线程退出 Lock的函数: 'acquire(wait=None)': 获取lock对象或等待wait时间 'locked()' 获得lock返回true,否则返回false 'release' :释放l