python中并发编程基础1

并发编程基础概念

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 Process
   import os
   def task():
       print(‘task  run‘)
       print(‘子进程task‘, os.getpid())
       print(‘子进程task父进程‘, os.getppid())

   if __name__ == ‘__main__‘:
       #创建子进程p = Process
       p = Process(target=task, name= ‘这是子进程‘)
       p.start()  # 给操作系统发送通知 要求操作系统开启进程,会自动调用run()方法
       print(‘py文件进程‘, os.getpid())
       print(‘py文件进程的父进程‘, os.getppid())

   ###输出结果
   py文件进程 10532
   py文件进程的父进程 15348
   task  run
   子进程task 4356
   子进程task父进程 10532
  
#开启进程的第二种方式
   #创建一个类,该类继承Process类,覆盖Process中的run方法,其优势是 可以自定义 进程的属性和行为 来完成一些额外任务 例如下载
   from multiprocessing import Process
   import os
   class MyProcess(Process):
       def __init__(self, url):
           self.url = url
           super().__init__()
       def run(self):  #方法名必须是run
           print(‘下载文件。。。。‘, self.url)
           print(‘子进程run的进程ID‘, os.getpid())
           print(‘子进程run的父进程ID‘, os.getppid())
   if __name__ == ‘__main__‘:
       p = MyProcess(‘21215135‘)
       p.start()   #会自动执行run
       print(‘py文件的进程ID‘, os.getpid())
       print(‘py文件的父进程ID‘, os.getppid())
      
  1. 进程之间的内存空间是隔离的

    from multiprocessing import Process
    import time
    ?
    a = 1002020212
    ?
    def test():
        global a
        a = 33520
        print(‘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)  
    
        ###
        daidai
        True
        20108
        life is so short, i use python
  4. 孤儿进程和僵尸进程

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

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

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

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

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

原文地址:https://www.cnblogs.com/5j421/p/10192293.html

时间: 2024-11-05 11:55:24

python中并发编程基础1的相关文章

Python 3 并发编程多进程之队列(推荐使用)

Python 3 并发编程多进程之队列(推荐使用) 进程彼此之间互相隔离,要实现进程间通信(IPC),multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的. 可以往队列里放任意类型的数据 创建队列的类(底层就是以管道和锁定的方式实现): 1 Queue([maxsize]):创建共享的进程队列,Queue是多进程安全的队列,可以使用Queue实现多进程之间的数据传递. 参数介绍: 1 maxsize是队列中允许最大项数,省略则无大小限制. 方法介绍: 1.主要

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

Python 3 并发编程多进程之进程同步(锁) 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的,竞争带来的结果就是错乱,如何控制,就是加锁处理. 1.多个进程共享同一打印终端 from multiprocessing import Process import os,time def work(): print('%s is running' %os.getpid()) time.sleep(2) print('%s is done' %os.g

OC中并发编程的相关API和面临的挑战

OC中并发编程的相关API和面临的挑战(1) 小引 http://www.objc.io/站点主要以杂志的形式,深入挖掘在OC中的最佳编程实践和高级技术,每个月探讨一个主题,每个主题都会有几篇相关的文章出炉,2013年7月份的主题是并发编程,今天挑选其中的第2篇文章(Concurrent Programming: APIs and Challenges)进行翻译,与大家分享一下主要内容.由于内容比较多,我将分两部分翻译(API和难点)完成,翻译中,如有错误,还请指正. 目录 1.介绍 2.OS

python并发编程基础之守护进程、队列、锁

并发编程2 1.守护进程 什么是守护进程? 表示进程A守护进程B,当被守护进程B结束后,进程A也就结束. from multiprocessing import Process import time ? def task(): print('妃子的一生') time.sleep(15) print('妃子死了') ? if __name__ == '__main__': fz = Process(target=task) fz.daemon = True #将子进程作为主进程的守护进程.必须在

使用Python进行并发编程

让计算机程序并发的运行是一个经常被讨论的话题,今天我想讨论一下Python下的各种并发方式. 并发方式 线程(Thread) 多线程几乎是每一个程序猿在使用每一种语言时都会首先想到用于解决并发的工具(JS程序员请回避),使用多线程可以有效的利用CPU资源(Python例外).然而多线程所带来的程序的复杂度也不可避免,尤其是对竞争资源的同步问题. 然而在python中由于使用了全局解释锁(GIL)的原因,代码并不能同时在多核上并发的运行,也就是说,Python的多线程不能并发,很多人会发现使用多线

Python中并发、多线程等

1.基本概念 并发和并行的区别: 1)并行,parallel 同时做某些事,可以互不干扰的同一时刻做几件事.(解决并发的一种方法) 高速公路多个车道,车辆都在跑.同一时刻. 2)并发 concurrency 同时做某些事,一个时段内有事情要处理.(遇到的问题) 高并发,同一时刻内,有很多事情要处理. 2.并发的解决 1)队列.缓冲区 排队就是把人排成队列,先进先出,解决了资源使用的问题. 排成的队列,其实就是一个缓冲地带,就是缓冲区. Queue模块的类queue.lifoqueue.prior

Go并发编程基础(译)

2015-05-20 三 By youngsterxyf 原文:Fundamentals of concurrent programming 译者:youngsterxyf 本文是一篇并发编程方面的入门文章,以Go语言编写示例代码,内容涵盖: 运行期并发线程(goroutines) 基本的同步技术(管道和锁) Go语言中基本的并发模式 死锁和数据竞争 并行计算 在开始阅读本文之前,你应该知道如何编写简单的Go程序.如果你熟悉的是C/C++.Java或Python之类的语言,那么 Go语言之旅 能

Scala入门到精通——第二十六节 Scala并发编程基础

作者:摇摆少年梦 视频地址:http://www.xuetuwuyou.com/course/12 本节主要内容 Scala并发编程简介 Scala Actor并发编程模型 react模型 Actor的几种状态 Actor深入使用解析 本节主要介绍的scala并发编程的基本思想,由于scala在2.10版本之后宣布使用akka作为其并发编程库,因此本节只进行基础性的内容介绍,后面将把重点放在akka框架的讲解上. 1. Scala并发编程简介 2003 年,Herb Sutter 在他的文章 "

python之并发编程

一.操作系统 1.概念 操作系统就是一个协调.管理和控制计算机硬件资源和软件资源的控制程序,操作系统位于计算机硬件与应用软件之间,本质也是一个软件. 操作系统由操作系统的内核(运行于内核态,管理硬件资源)以及系统调用(运行于用户态,为应用程序员写的应用程序提供系统调用接口)两部分组成 现代计算机或者网络都是多用户的,多个用户不仅共享硬件,而且共享文件,数据库等信息,共享意味着冲突和无序. 2.操作系统功能 1.记录哪个程序使用什么资源 2.对资源请求进行分配 3.为不同的程序和用户调解互相冲突的