1.进程的概念

一个CPU的时候运行,轮询调度实现并发执行


多CPU运行机制:

计算机程序:存储在磁盘上的可执行二进制(或其他类型)文件。
只有把它们加载到内存中,并被操作系统调用它们才会拥有其自己的生命周期。

进程:表示的一个正在执行的程序。
每个进程都拥有自己的地址空间、内存、数据栈以及其他用于跟踪执行的辅助数据
操作系统负责其上所有进程的执行,操作系统会为这些进程合理地分配执行时间。

多进程测试

使用多进程测试代码必须两核以上(相当于多个CPU同时运行)

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2018/10/13 16:26
# @Author  : DoubleChina
# @Site    :
# @File    : ThreadTest.py
# @Software: PyCharm
import time
import multiprocessing
import os  # 系统模块def func():time.sleep(3)i = 0for j in range(1000):i += 1return Truedef main():start_time = time.time()# 创建一个子进程,进程对象p = multiprocessing.Process(target=func)# 获取当前进程的名字# multiprocessing.current_process()# 判断这个进程实例,是否还在运行# p.is_alive()# 不管这个是否在运行,强制杀掉# p.terminate()# 默认值False,主进程p.daemon = True# join 等待这个进程结束,主进程才结束# p.join()# 启动进程p.start()func()end_time = time.time()print("子进程:", end_time - start_time)def get_pid():# linux独有的,window上没有# linux创建进程,是操作系统把父进程的东西拷贝到子进程,复制进程# windows创建进程,类似于模块导入的方法,一定要写main方法,要不会出现执行多次pid = os.fork()if pid == 0:  # 子进程永远返回的是0print('子进程{},父进程{}'.format(os.getpid(), os.getppid()))else:  # 父进程返回的是子进程的idprint('父进程{},子进程{}'.format(os.getpid(), pid))def main1():start_time = time.time()func()func()end_time = time.time()print(end_time - start_time)class BolockProcess(multiprocessing.Process):def __init__(self):super().__init__()def run(self):n = 5while n > 0:print('the time is{}'.format(time.ctime()))time.sleep(2)n -= 1def test_BolockProcess():  # 对象继承for i in range(5):p = BolockProcess()p.start()if __name__ == '__main__':# start_time = time.time()# main()# end_time = time.time()# print("主进程:", end_time - start_time)# main1()# get_pid()test_BolockProcess()
单进程运行时间:
22.23472023010254秒
多进程运行速度:
11.984376192092896秒

多进程调用流程:

计算密集型:在python中,计算密集型用多进程
IO密集型:爬虫典型的IO密集型,用多线程,但是在python中多线程GIL槽糕的设计,比单线程整整慢了45%,但是在Python3以后已经优化了。

2.多线程

线程被称作轻量级进程。
与进程类似,不过它们是在同一个进程下执行的,并且它们会共享相同的上下文。

  • 当其他线程运行时,它可以被抢占(中断)
  • 和临时挂起(也成为睡眠) — 让步

线程的轮训调度机制类似于进程的轮询调度。
只不过这个调度不是由操作系统来负责,而是由Python解释器来负责。

多线程方法详解

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2018/10/13 16:26
# @Author  : DoubleChina
# @Site    :
# @File    : ThreadTest.py
# @Software: PyCharm
import time
import threadingdef func():i = 0for j in range(100000000):i += 1return Truedef main():start_time = time.time()# 创建一个子进程p = threading.Thread(target=func)# 线程守护p.setDaemon(True)# 设置线程名称p.setName("线程1")# 获取线程名称p.getName()p.start()func()end_time = time.time()print(end_time - start_time)def main1():start_time = time.time()func()func()end_time = time.time()print(end_time - start_time)class MyThread(threading.Thread):def __init__(self, name):super().__init__()self.name = namedef run(self):time.sleep(2)print('I am is{}'.format(self.name))if __name__ == '__main__':  # 一个文件如果是自己执行  __name__就是main# 22.1539466381073秒# GIL锁,线程使用在3.6以后有大版本的优化# main()# 23.165987253189087秒# main1()thread_list = []start_time = time.time()for i in range(100):t = MyThread('线程{}号'.format(i))# 线程守护,主线程结束,子线程也会全部关掉t.setDaemon(True)t.start()# 线程idt.identthread_list.append(t)# for t in thread_list:# 等待子线程结束,主线程阻塞的作用# t.join()end_time = time.time()print(end_time - start_time)

GIL锁

Python在设计的时候,还没有多核处理器的概念。
因此,为了设计方便与线程安全,直接设计了一个锁。
这个锁要求,任何进程中,一次只能有一个线程在执行。
因此,并不能为多个线程分配多个CPU。所以Python中的线程只能实现并发,而不能实现真正的并行。

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

多线程处理Socket并发

服务器:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2018/10/13 21:56
# @Author  : DoubleChina
# @Site    :
# @File    : ThreadSocket.py
# @Software: PyCharm
import socket
import threadingserver = socket.socket()
server.bind(('', 9999))
server.listen(5)def readThread(conn, addr):"""创建一个新的线程,负责和一个客户端通讯:param conn::param addr::return:"""while True:data = conn.recv(1024)if data:print('{}:{}'.format(addr, data))else:print("客户端{}已关闭".format(addr))breakconn.close()while True:print('------主线程,等待客户端连接------')conn, addr = server.accept()print('创建一个新的线程,和客户端{}通讯'.format(addr))# 创建一个子线程,负责消息收发client = threading.Thread(target=readThread, args=(conn, addr))# 启动线程client.start()

客户端:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2018/10/13 7:38
# @Author  : DoubleChina
# @Site    :
# @File    : SocketTest.py
# @Software: PyCharm
import socket# 创建套接字
s = socket.socket()
# 连接套接字,ip和端口必须是服务器上的
s.connect(('127.0.0.1', 9999))
while True:data = input("输入发送消息:")if 'q' == data:s.close()breaks.send(data.encode())# print('接受服务器返回的消息:', s.recv(1024))
# s.close()

多进程处理Socket并发

服务器:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2018/10/13 21:56
# @Author  : DoubleChina
# @Site    :
# @File    : ThreadSocket.py
# @Software: PyCharm
import socket
import threading
import multiprocessingserver = socket.socket()
server.bind(('', 9999))
server.listen(5)def readProcess(conn, addr):"""创建一个新的线程,负责和一个客户端通讯:param conn::param addr::return:"""while True:data = conn.recv(1024)if data:print('{}:{}'.format(addr, data))else:print("客户端{}已关闭".format(addr))breakconn.close()while True:print('------主线程,等待客户端连接------')conn, addr = server.accept()print('创建一个新的进程,和客户端{}通讯'.format(addr))# 创建一个子进程p = multiprocessing.Process(target=readProcess, args=(conn, addr))p.start()

Python之多进程和多线程详解相关推荐

  1. 很多人现在还不知道的知识点,Python多进程和多线程详解!

    1 单进程单线程:一个人在一个桌子上吃菜. 2 单进程多线程:多个人在同一个桌子上一起吃菜. 3 多进程单线程:多个人每个人在自己的桌子上吃菜. 多线程的问题是多个人同时吃一道菜的时候容易发生争抢,例 ...

  2. python多进程应用场景_python使用多进程的实例详解

    python多线程适合IO密集型场景,而在CPU密集型场景,并不能充分利用多核CPU,而协程本质基于线程,同样不能充分发挥多核的优势. 针对计算密集型场景需要使用多进程,python的multipro ...

  3. python可以开多少线程_python多线程详解

    python多线程详解 一.线程介绍 什么是线程 线程(Thread)也叫轻量级进程,是操作系统能够进行运算调度的最小单位,它被包涵在进程之中,是进程中的实际运作单位.线程自己不拥有系统资源,只拥有一 ...

  4. python多线程详解 Python 垃圾回收机制

    文章目录 python多线程详解 一.线程介绍 什么是线程 为什么要使用多线程 总结起来,使用多线程编程具有如下几个优点: 二.线程实现 自定义线程 守护线程 主线程等待子线程结束 多线程共享全局变量 ...

  5. python多进程队列中的队列_python 多进程队列数据处理详解

    我就废话不多说了,直接上代码吧! # -*- coding:utf8 -*- import paho.mqtt.client as mqtt from multiprocessing import P ...

  6. [Python 多线程] 详解daemon属性值None,False,True的区别

    [Python 多线程] 详解daemon属性值None,False,True的区别 记录学习python不懂得和遇到得问题 每个进程至少要有一个线程,并最为程序的入口,这个进程就是主线程. 每个进程 ...

  7. python编程入门与案例详解-quot;Python小屋”免费资源汇总(截至2018年11月28日)...

    原标题:"Python小屋"免费资源汇总(截至2018年11月28日) 为方便广大Python爱好者查阅和学习,特整理汇总微信公众号"Python小屋"开通29 ...

  8. python编程语法大全-Python编程入门——基础语法详解

    今天小编给大家带来Python编程入门--基础语法详解. 关于怎么快速学python,可以加下小编的python学习群:611+530+101,不管你是小白还是大牛,小编我都欢迎,不定期分享干货 每天 ...

  9. python编程语法-Python编程入门——基础语法详解

    今天小编给大家带来Python编程入门--基础语法详解. 一.基本概念 1.内置的变量类型: Python是有变量类型的,而且会强制检查变量类型.内置的变量类型有如下几种: #浮点 float_num ...

最新文章

  1. 全球第三大手机操作系统!倒闭!
  2. C 语言实例 - 计算自然数的和
  3. web service方法进行全文检索_SpringMVC(Web应用)配置教程终章项目实战
  4. kafka的offset笔记
  5. 如何不用 List.clear() 方法 就清空 list 中的 所有元素(中兴面试)
  6. java 无法找到ant_Java-Ant需要tools.jar并且无法找到我
  7. 实例解说Linux命令行uniq
  8. js准确获取当前页面url网址信息
  9. 编程珠玑:位图法排序
  10. 论文中baseline是什么意思?
  11. 外贸常用术语_常见国际贸易专业术语有哪些?
  12. U盘格式化后容量变小
  13. 【微信小程序】z-index失效
  14. Linux下线程池源码实现
  15. python locust学习笔记
  16. 什么是嵌入式服务器?为什么使用嵌入式服务器?
  17. poi实现单元格行合并
  18. spoolsv.exe占cpu 99%的解决方法
  19. LeetCode 每日一题:606. 根据二叉树创建字符串
  20. 掏心掏肺,教你如何把苍白的人生写成老板都心动的简历

热门文章

  1. 如何在服务器上使用Jupyter-简易版
  2. 计算机准考证要打印多大的纸?打印大了,可以吗?
  3. Mac:解决移动硬盘异常退出后无法识别
  4. 可可猪:一只会选日子的猪
  5. CISCN2021_华南初赛_记录
  6. 三星S5PV210Android系统下LED灯驱动程序
  7. xtrabackup 详解
  8. 电脑双网卡设置不同网关(有线网卡+无线网卡)
  9. 贪婪算法——十大算法
  10. 大学第一年, coding 第一年