多线程和多进程的区别
类似前言一样的东西
多线程和多进程各有优缺点,没有哪个是最好,只有在不同情况下,哪种是更好的
参考文章
https://blog.csdn.net/lishenglong666/article/details/8557215 ---优秀的分割线---
首先先从大概念来解释多线程和多进程的区别,多线程就是CPU资源的分配,多进程就是电脑内存的分配
举个例子,进程相当于公路,线程相当于是分岔路 电脑需要一条公路来运输数据,但是不同的数据有不同的目的地
但是开新的公路代价太高,所以可以在一条公路上分成两条、三条道
不需要的时候小道就销毁掉,需要就再开
多线程相比于多进程来说,线程创建、销毁的代价低,其次进程多了,内存占用的也多,但是CPU利用率低
但是也不是说多进程就一无是处,多进程的可靠性比多线程高,因为进程和进程之间不会互相影响,而多线程有可能会因为一个线程的爆炸而导致进程崩溃
在网上看到的一篇关于这个的表,觉得不错,故而转载
举个用多线程的例子根据上面的优缺点来判断,需要频繁创建、销毁的优先用线程拿之前培训的一个脚本来说
#coding=utf-8
import socket
import threading
import time
#创建socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#监听端口
s.bind(("127.0.0.1",8888))
print("Success")
#指定等待最大连接数量
s.listen(5)
def tcp(sock,addr):
print ("connection from %s:%s " % addr)
sock.send(b"welcome, what's your name") #发送数据给客户端
while True:
data = sock.recv(100)
time.sleep(1)
if data=="exit":
sock.send(b"quit")
break
sock.send(b"hello "+data)
sock.close()
while True:
sock,addr = s.accept() #接受所有来自客户端的内容
t = threading.Thread(target=tcp,args=(sock,addr)) #创建线程
t.start() #开启线程
26-29是多线程的部分,这里的作用呢,就是来一个用户,就开启一个线程,去处理这个用户的请求,当用户断开连接时,就销毁线程
还有一个场景,就是需要进行大量计算,或者处理大量数据的,也可以用到多线程比如说用扫描网站的工具扫描网站后台,只有一个线程去处理这一个网站时,他需要单独的去完成3000+个的枚举,但是假如有60个线程的话,那么每个线程就只需要500+个的枚举,加快速度的同时将空闲的CPU资源利用起来了
那么具体什么时候用到多进程呢,因为本人基本上用的都是单进程多线程的,所以解释的会不到位,有意见的大佬可以指出来,马上改
进程和线程的差别,我觉得就是工作量上的问题,任务量比较小的时候,线程是占优的,任务量大的时候,进程就占优了,进程的例子举不出来,阔以看下表
所以在日常工作时,处理工作量大的时候,进程就是不错的选择了,而像我平时处理小数据的,脚本用线程来处理就是绝佳的了
结尾
讲道理,上面的参考链接举的例子很清楚了,而且讲的也明白,而且我的用法都是单进多线,没啥必要写这篇文章,写了也不全面,但是既然学弟都这么说了,想让我写上一篇,那我只好说说自己的愚见,各大佬不喜勿喷
- MySQL反连接的优化总结(r10笔记第51天)
- python基础知识——内置数据结构(列表)
- 【Go 语言社区】Go语言Slice去重
- 【Go 语言社区】Golang 语言再谈接口
- 【Go 语言社区】Golang 语言再谈常量
- 【Go 语言社区】HTML5 Canvas+JS控制电脑或手机上的摄像头实例
- MySQL Profile在5.7的简单测试(r10笔记第50天)
- 【Go 语言社区】Golang中interface判断nil问题
- 有趣的rownum测试(r10笔记第49天)
- 【Go 语言社区】关于Golang 数据缓存到redis内存数据库遇到的问题
- go中的读写锁RWMutex
- Centos7.4 版本环境下安装Mysql5.7操作记录
- 你必须知道的23个最有用的Elasticseaerch检索技巧
- Elasticsearch Jest实战深入详解
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法