问题一: 计算机是如何执行程序指令的?

问题二: 计算机如何实现并发的?

轮询调度实现并发执行 程序1-8轮询完成,才再CPU上运行

问题三: 真正的并行需要依赖什么?

并行需要的核心条件

多进程实现并行

问题一: 什么是进程?

计算机程序是存储在磁盘上的文件。

  只有把它们加载到内存中,并被操作系统调用 它们才会拥有其自己的生命周期。

进程表示一个正在执行的程序。

  每个进程都有独立地址空间以及其他的辅助数据

进程(Process)

  是计算机中已运行程序的实例

问题二: 如何在Python中使用进程?

import multiprocessing   # 导入进程模块
import datetime
import time def func(data): while True:
print(datetime.datetime.now()) sum = data + 100
print(sum)
time.sleep(2) print(datetime.datetime.now()) if __name__ == '__main__': p = multiprocessing.Process(target=func, args=(123,)) # 创建一个进程,args传参 必须是元组
p.start() # 运行线程p while True:
time.sleep(2)
print("我是主进程")

进程使用步骤

问题三: 多进程实现并行的必要条件是什么?

总进程数量不多于 CPU核心数量!

如果不满足,那么运行的程序都是 轮询调度产生的假象。

多线程实现并发

问题一:什么是线程?

线程被称作轻量级进程。
  线程是进程中的一个实体,操作系统不会为进程分配内存空间,它只有一点在运行中必不可少的资源
线程被包含在进程中,是进程中的实际运作单位
  同一个进程内的多个线程会共享相同的上下文,
  也就是共享资源(内存和数据)。
线程(thread)
  是操作系统能够进行运算调度的最小单位

问题二: 如何在Python中使用线程?

import multiprocessing  # 引用进程模块
import threading # 引用线程模块
import time def func(data):
while True:
time.sleep(1)
data += 1
print(data) # mult = multiprocessing.Process(target=func, args=(1314,))
# mult.start() # 运行进程 thre = threading.Thread(target=func, args=(500,)) # 创建一个线程
thre.start() # 运行线程 print("这是主进程")

进程使用步骤

问题三: 为什么多线程不是并行?

稳定性
  进程具有独立的地址空间,一个进程崩溃后,不会对其它进程产生影响。
  线程共享地址空间,一个线程非法操作共享数据崩溃后,整个进程就崩溃了。
创建开销
  创建进程操作系统是要分配内存空间和一些其他资源的。开销很大
  创建线程操作系统不需要再单独分配资源,开销较小
切换开销
  不同进程直接是独立的, 切换需要耗费较大资源
  线程共享进程地址空间, 切换开销小

GIL锁(线程锁)

Python在设计的时候,还没有多核处理器的概念。
因此,为了设计方便与线程安全,直接设计了一个锁。
这个锁要求,任何进程中,一次只能有一个线程在执行。

因此,并不能为多个线程分配多个CPU。
所以Python中的线程只能实现并发,
而不能实现真正的并行。

但是Python3中的GIL锁有一个很棒的设计,
在遇到阻塞(不是耗时)的时候,会自动切换线程。

很多库是基于GIL锁写的,取消代价太大
进程可以实现并行和并发
线程只能实现并发

遇到阻塞就自动切换。
我们可以利用这种机制来
充分利用CPU

那么最后:

使用多进程与多线程来实现并发服务器

使用多进程与多线程实现并发服务器的关键点
关键点一: 多进程是并行执行,
                 相当于分别独立得处理各个请求。
关键点二: 多线程,虽然不能并行运行,
                 但是可以通过避开阻塞切换线程
                 来实现并发的效果,并且不浪费cpu

服务端实现代码:

import threading  # 创建一个线程
import socket server = socket.socket()
server.bind(('0.0.0.0', 8888))
server.listen() # 监听 def workon(conn):
while True:
data = conn.recv(1024) if data == b'':
conn.close()
break
else:
print("接收到的消息: {}".format(data.decode()))
conn.send(data) # 主线程
while True:
conn, addr = server.accept()
print("{}正在连接".format(addr)) # 线程去处理消息
p = threading.Thread(target=workon, args=(conn,))
p.start()

客户端代码:

import socket

click = socket.socket()
click.connect(('127.0.0.1', 8888)) while True:
data = input("请输入你要发送的数据:")
click.send(data.encode())
print("接收到的消息: {}".format(click.recv(1024).decode()))

总结完成!

作者:含笑半步颠√

博客链接:https://www.cnblogs.com/lixy-88428977

声明:本文为博主学习感悟总结,水平有限,如果不当,欢迎指正。如果您认为还不错,欢迎转载。转载与引用请注明作者及出处。

python_并行与并发、多线程的更多相关文章

  1. c++11并行、并发与多线程编程

    首先,我们先理解并发和并行的区别. 你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行. 你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并 ...

  2. C#并行编程-并发集合

    菜鸟学习并行编程,参考<C#并行编程高级教程.PDF>,如有错误,欢迎指正. 目录 C#并行编程-相关概念 C#并行编程-Parallel C#并行编程-Task C#并行编程-并发集合 ...

  3. Java 并行与并发

    Java 并行与并发 注意两个词:并行(Concurrent) 并发(Parallel) 并行:是逻辑上同时发生,指在某一个时间内同时运行多个程序 并发:是物理上同时发生,指在某一个时间点同时运行多个 ...

  4. python网络编程基础(线程与进程、并行与并发、同步与异步、阻塞与非阻塞、CPU密集型与IO密集型)

    python网络编程基础(线程与进程.并行与并发.同步与异步.阻塞与非阻塞.CPU密集型与IO密集型) 目录 线程与进程 并行与并发 同步与异步 阻塞与非阻塞 CPU密集型与IO密集型 线程与进程 进 ...

  5. Clojure的并行与并发

    这次来聊聊clojure的并行与并发,如果你还不知clojure为何物,请翻翻我的上一篇推文.“并行”是指clojure对并行计算的支持(parallel computing),“并发”是其并发特性( ...

  6. java并发多线程显式锁Condition条件简介分析与监视器 多线程下篇(四)

    Lock接口提供了方法Condition newCondition();用于获取对应锁的条件,可以在这个条件对象上调用监视器方法 可以理解为,原本借助于synchronized关键字以及锁对象,配备了 ...

  7. java 并发多线程 锁的分类概念介绍 多线程下篇(二)

    接下来对锁的概念再次进行深入的介绍 之前反复的提到锁,通常的理解就是,锁---互斥---同步---阻塞 其实这是常用的独占锁(排它锁)的概念,也是一种简单粗暴的解决方案 抗战电影中,经常出现为了阻止日 ...

  8. java 并发多线程显式锁概念简介 什么是显式锁 多线程下篇(一)

    目前对于同步,仅仅介绍了一个关键字synchronized,可以用于保证线程同步的原子性.可见性.有序性 对于synchronized关键字,对于静态方法默认是以该类的class对象作为锁,对于实例方 ...

  9. 《Go语言实战》摘录:6.1 并发 - 并行 与 并发

    6.1 并行 与 并发

随机推荐

  1. 洛谷P2949题解

    若想要深入学习反悔贪心,传送门. Description: 有 \(n\) 项工作,每 \(i\) 项工作有一个截止时间 \(D_i\) ,完成每项工作可以得到利润 \(P_i\) ,求最大可以得到多 ...

  2. Vue绑定事件,双向数据绑定,只是循环没那么简单

    v-on对象处理 <p @mouseover = "doTish" @mouseout = "doThat"> 对象形式 </p> &l ...

  3. nginx 访问控制之 http_referer

    在rewrite时,曾经用过该变量,当时实现了防盗链功能. 其实基于该变量,我们也可以做一些特殊的需求. 示例: 背景:网站被黑挂马,搜索引擎收录的网页是有问题的,当通过搜索引擎点击到网站时,却显示一 ...

  4. abp中使用同步方法调用异步方法

    var result= AsyncHelper.RunSync(()=>{   return  _service.GetUserAsync();   });

  5. IIS 7中添加匿名访问FTP站点

    1. 开启FTP和IIS服务: 2.打开IIS 管理器: 我电脑上是IIS 7.5 ,所以选择第一个并点击打开哦. 如果你想知道自己IIS的版本,打开帮助菜单: 3. 新建FTP站点: 4. 填写站点 ...

  6. 蓝牙BLE: 蓝牙(BLE)协议栈

    蓝牙协议是通信协议的一种,一般而言,我们把某个协议的实现代码称为协议栈(protocol stack),BLE协议栈就是实现低功耗蓝牙协议的代码,理解和掌握BLE协议是实现BLE协议栈的前提.当前的蓝 ...

  7. 爬虫中Selenium和PhantomJS

    Selenium Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,类型像我们玩游戏用的按键精灵,可以按指定的命令自动操作,不同是Selenium 可以直接运行在浏览器上, ...

  8. Holmos框架

    一.Holmos介绍--简介 Holmos-webtest是一个居于selenium2.0二次封装的开源框架,采用Page-Object模式去组织页面结构,同时支持多维度的页面元素定位方式,同时还继承 ...

  9. phpmyadmin上在某数据库里创建函数

    改那个PHP项目加了个功能,本地MYSQL里添加了一个函数了,现在要转到服务器上,然后服务器上的MYSQL只能通过PHPMYADMIN网页操作的,在网页上SQL里输入创建函数的语句, 结果报错了:th ...

  10. 查找算法(7)--Hash search--哈希查找

    1.哈希查找 (1)什么是哈希表(Hash) 我们使用一个下标范围比较大的数组来存储元素.可以设计一个函数(哈希函数, 也叫做散列函数),使得每个元素的关键字都与一个函数值(即数组下标)相对应,于是用 ...