并发编程基础概念

1.进程。
  1. 什么是进程?

    正在运行的程序就是进程。程序只是代码。

  2. 什么是多道?

    多道技术:

    1.空间上的复用(内存)。将内存分为几个部分,每个部分放入一个程序,这样同一时间在内存中就有了多道程序。

    2.时间上的复用(CPU的分配)。只有一个CPU,如果程序在运行过程中遇到了I/O阻塞或者运行时间足够长。操作系统会按照算法将CPU分配给其他程序使用,依次类推。直到第一个程序被重新分配到CPU会继续运行。

    多道技术中的问题解决:

    空间复用:程序之间的内存必须分割。这种分割需要在硬件层面实现,由操作系统控制。保证安全性和稳定性。

  3. multiprocessing模块的使用

    python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源,python中大部分情况需要使用多进程。python提供了multiprocessing模块。

    multiprocessing模块是用来开启子进程,并可以在子进程中定制任务。

  4. Process类

    process类的作用是用来创建进程的类。

    Process([group [, target [, name [, args [, kwargs]]]]]),由该类实例化得到的对象,表示一个子进程中的任务(尚未启动)
    强调:

    1. 需要使用关键字的方式来指定参数

    2. args指定的为传给target函数的位置参数,是一个元组形式,必须有逗号

    参数介绍:

    1、group参数未使用,值始终为None

    2、target表示调用对象,即子进程要执行的任务

    3、args表示调用对象的位置参数元组,args=(1,2,'ming',)

    4、kwargs表示调用对象的字典,kwargs={'name':'ming','age':20}

    5、name为子进程的名称

  **方法介绍**:​  1、p.start():启动进程,并调用该子进程中的p.run() ​ 2、p.run():进程启动时运行的方法,正是它去调用target指定的函数,我们自定义类的类中一定要实现该方法  ​ 3、p.terminate():强制终止进程p,不会进行任何清理操作,如果p创建了子进程,该子进程就成了僵尸进程,使用该方法需要特别小心这种情况。如果p还保存了一个锁那么也将不会被释放,进而导致死锁​ 4、p.is_alive():如果p仍然运行,返回True​ 5、p.join([timeout]):主线程等待p终止(强调:是主线程处于等的状态,而p是处于运行的状态)。timeout是可选的超时时间,需要强调的是,p.join只能join住start开启的进程,而不能join住run开启的进程 
  **属性介绍:**​  1、p.daemon:默认值为False,如果设为True,代表p为后台运行的守护进程,当p的父进程终止时,p也随之终止,并且设定为True后,p不能创建自己的新进程,必须在p.start()之前设置​ 2、p.name:进程的名称 ​ 3、p.pid:进程的pid​ 4、p.exitcode:进程在运行时为None、如果为–N,表示被信号N结束(了解即可) 5、p.authkey:进程的身份验证键,默认是由os.urandom()随机生成的32字符的字符串。这个键的用途是为涉及网络连接的底层进程间通信提供安全性,这类连接只有在具有相同的身份验证键时才能成功(了解即可)

5.Process类的使用

  
#创建进程的第一种方式##注意:在windows 中,开启一个子进程就是完全复制一个父进程的代码并运行。如果不写在if __name__ == '__main__':下面会形成一个无穷的循环。if __name__ == '__main__':的作用是以当前文件运行__name__ 会== '__main__'from multiprocessing import Processimport osdef task():print('task  run')print('子进程task', os.getpid())print('子进程task父进程', os.getppid())if __name__ == '__main__':#创建子进程p = Processp = Process(target=task, name= '这是子进程')p.start()  # 给操作系统发送通知 要求操作系统开启进程,会自动调用run()方法print('py文件进程', os.getpid())print('py文件进程的父进程', os.getppid())###输出结果py文件进程 10532py文件进程的父进程 15348   task  run子进程task 4356子进程task父进程 10532

  
#开启进程的第二种方式#创建一个类,该类继承Process类,覆盖Process中的run方法,其优势是 可以自定义 进程的属性和行为 来完成一些额外任务 例如下载from multiprocessing import Processimport osclass MyProcess(Process):def __init__(self, url):self.url = urlsuper().__init__()def run(self):  #方法名必须是runprint('下载文件。。。。', self.url)print('子进程run的进程ID', os.getpid())print('子进程run的父进程ID', os.getppid())if __name__ == '__main__':p = MyProcess('21215135')  p.start()   #会自动执行runprint('py文件的进程ID', os.getpid())print('py文件的父进程ID', os.getppid())

  1. 进程之间的内存空间是隔离的

    from multiprocessing import Process
    import time
    ​
    a = 1002020212
    ​
    def test():global aa = 33520print('test进程的a', a)
    ​
    if __name__ == '__main__':p = Process(target=test)   #创建进程p.start()           #启动进程
    ​time.sleep(1)print('py文件进程中的a', a)###输出结果
    test进程的a 33520
    py文件进程中的a 1002020212
    结论:
    1.子进程中的数据修改,不会影响父进程。
    2.子进程的创建和父进程无关。

  2. Process对象的join方法

    join方法的作用是:父进程等待子进程结束。

    from multiprocessing import Process
    import time
    ​
    def task(num):# time.sleep(2)print('我是%s号进程' % num)
    ​
    if __name__ == '__main__':start_time = time.time()ps = []for i in range(5):s = Process(target=task, args=(i,))s.start()ps.append(s)for n in ps:n.join(0.04)print(time.time()-start_time)print('over')

  3. Process对象常用属性

    from multiprocessing import Process
    import time
    ​
    def test():time.sleep(3)print('life is so short, i use python')
    ​
    if __name__ == '__main__':p = Process(target=test, name='daidai')p.start()print(p.name)  #进程名print(p.is_alive())   #进程是否存活# p.terminate()       #终止进程print(p.pid)  ###
        daidaiTrue20108life is so short, i use python

  4. 孤儿进程和僵尸进程

    孤儿进程:是指父进程已经终止,但是自己还在运行

    孤儿进程是无害的:例如QQ打开了浏览器, 然后QQ关闭,浏览器运行

    僵尸进程:是指子进程完全执行完所有的任务,已经终止了但是还残留一些信息。(进程id 和 进程名等)

    但是父进程没有处理这些残留信息,导致残留信息占用系统内存。

    当出现大量的僵尸进程时,会占用系统资源,可以将他的父进程杀掉,僵尸成了孤儿,然后操作系统会负责收回内存。

  5. 基于多进程的TCP套接字通信

    

##基于多进程实现并发通信服务器from socket import *
from multiprocessing import Process
import structserver = socket()
server.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
server.bind(('127.0.0.1', 33520))
server.listen()
def communicate(c, addr):try:while True:data = c.recv(4)   #1msg_len = struct.unpack('i', data)[0]msg_data = c.recv(msg_len)  #2if not msg_data:err_info = '对方正在输入!'err_info_data = err_info.encode('utf-8')back_len_data = struct.pack('i', len(err_info_data))c.send(back_len_data)c.send(err_info_data)back_len = struct.pack('i', len(msg_data))c.send(back_len)c.send(msg_data)print(msg_data.decode('utf-8'))except Exception as e:print(e)if __name__ == '__main__':while True:c, addr = server.accept()p = Process(target=communicate, name=None, args=(c, addr))p.start()#客户端,可开启多个,但是每连接一个就开启一个进程
from socket import *
import structclient = socket()
client.connect(('127.0.0.1', 33520))
while True:msg = input('请输入发送的消息:').strip()msg_data = msg.encode('utf-8')msg_len_s = struct.pack('i', len(msg_data))client.send(msg_len_s)client.send(msg_data)data_len = client.recv(4)  #收到消息长度length = struct.unpack('i', data_len)[0]data = client.recv(length)back_msg = data.decode('utf-8')print('返回的消息:%s' % back_msg)

转载于:https://www.cnblogs.com/5j421/p/10192293.html

python中并发编程基础1相关推荐

  1. 『Python学习笔记』Python实现并发编程(补充joblibpymysql)

    Python实现并发编程(补充joblib&pymysql) 文章目录 一. 并发编程知识点 1.1. 为什么引入并发编程 1.2. 如何选择多线程多进程多协程 1.2.1. 什么是CPU密集 ...

  2. python编程基础与应用-Python程序设计:从编程基础到专业应用

    基本信息 书名:Python程序设计:从编程基础到专业应用 :42.00元 作者:章宁,李海峰 编 出版社:机械工业出版社 出版日期:2019_03_01 ISBN:9787111620136 字数: ...

  3. Java并发编程基础--ThreadLocal

    Java并发编程基础之ThreadLocal ​ ThreadLocal是一个线程变量,但本质上是一个以ThreadLocal对象为键.任意对象为值的存储结构,这个结构依附在线程上,线程可以根据一个T ...

  4. Python 3 并发编程多进程之进程同步(锁)

    Python 3 并发编程多进程之进程同步(锁) 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的,竞争带来的结果就是错乱,如何控制,就是加锁处理. 1. ...

  5. Java并发编程的艺术-Java并发编程基础

    第4章 Java并发编程基础 ​ Java从诞生开始就明智地选择了内置对多线程的支持,这使得Java语言相比同一时期的其他语言具有明显的优势.线程作为操作系统调度的最小单元,多个线程能够同时执行,这将 ...

  6. 【牛客网】-【并发详解】-【并发编程基础】-【原子类】

    目录 并发编程基础 原子类 参考书目: 并发编程基础 在操作系统中,并发是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处 ...

  7. Python中Socket编程

    目录 Python中Socket编程 1 一.Socket概述 1 二.python中socket模块使用 1 三.socket之聊天室 3 四.socket之端口探测 7 五.scapy之tcp端口 ...

  8. python中IO编程中关于StringIO的读写问题

    阅读前请看一下:我是一个热衷于记录的人,每次写博客会反复研读,尽量不断提升博客质量.文章设置为仅粉丝可见,是因为写博客确实花了不少精力.希望互相进步谢谢!! 文章目录 阅读前请看一下:我是一个热衷于记 ...

  9. python中面向对象编程简称为_Python基础-面向对象编程

    本文完全转载自廖雪峰大神的教程: 面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的 ...

最新文章

  1. pandas重置dataframe的索引(reset_index)、如果索引不匹配dataframe操作时候的问题、重置索引(不设置drop=true)远索引生成新的数据列
  2. Timestamp、String、Date之间的转换
  3. PSO求解梯级水库优化调度
  4. Mac安装docker+nginx+挂载文件详细体验
  5. poj 2397(二分+dp)
  6. 记录输入框本地记录用户名效果
  7. Android 抽屉效果Demo
  8. finally块_如何从finally块访问方法的结果值
  9. 快速排序——算法系列
  10. 再利用Chakra引擎绕过CFG
  11. php黄页,PHP 黄页的url
  12. python实现pdf解密和pdf转图片
  13. flask与js交互的示例代码_Frida Java Hook 详解(安卓9):代码及示例(上)
  14. 停就删稿!这个“可怕”的 GitHub 开源项目值得一试
  15. 如何在Java客户端调用RESTful服务
  16. python如何计算超大整数_Python 实现大整数乘法算法
  17. WebView·开车指南
  18. php无限分类算法,php递归算法 php递归函数无限级分类
  19. 1、 域名系统的主要功能是什么?互联网的域名结构是怎样的?域名系统中的本地域名服务器、根域名服务器、顶级域名服务器以及权限域名服务器有何区别?2、 假定要从已知的URL获得一个万维网文档。若该万维网服
  20. [转]不可不知的十部交响曲

热门文章

  1. 元数据交换绑定的秘密
  2. android meta data值获取的坑
  3. Jenkins 部署
  4. Oracle在线重定义
  5. JSP复习(二):EL表达式
  6. CentOS下MongoDB的升级
  7. 多个线程对hashmap进行put操作的异常
  8. 火墙之firewalld
  9. 2017.07.05 第五组 NABCD+用户原型+用户调研
  10. UWP 文件读写API