由于GIL(全局解释锁)的问题,多线程并不能充分利用多核处理器,如果是一个CPU计算型的任务,应该使用多进程模块 multiprocessing 。它的工作方式与线程库完全不同,但是两种库的语法和接口却非常相似。multiprocessing给每个进程赋予单独的Python解释器,这样就规避了全局解释锁所带来的问题。

1.进程创建方式

  方式一、:(开启进程必须放在if __name__ == '__main__':代码块内)

  1. import time
  2. import random
  3. from multiprocessing import Process
  4.  
  5. def piao(name):
  6. print('%s piaoing' %name)
  7. time.sleep(random.randrange(1,5))
  8. print('%s piao end' %name)
  9.  
  10. if __name__ == '__main__': # 进程开启必须放在main()下
  11. for i in ('aaa', 'bbb', 'ccc'):
  12. p = Process(name=i, target=piao, args=(i,))
  13. p.start()
  14. print('主进程')

  方式二:

  1. class Piao(Process):
  2. def __init__(self,name):
  3. super().__init__()
  4. self.name = name
  5.  
  6. def run(self):
  7. print('%s piaoing' %self.name)
  8. time.sleep(random.randrange(1,5))
  9. print('%s piao end' %self.name)
  10.  
  11. if __name__ == '__main__': # 进程开启必须放在main()下
  12. for i in ('aaa', 'bbb', 'ccc'):
  13. p = Process(name=i, target=piao, args=(i,))
  14. p.start()
  15. print('主进程')

2.进程其他方法示例

  方法介绍:

  1. p.start():启动进程,并调用该子进程中的p.run()
  2. p.run():进程启动时运行的方法,正是它去调用target指定的函数,我们自定义类的类中一定要实现该方法
  3.  
  4. p.terminate():强制终止进程p,不会进行任何清理操作,如果p创建了子进程,该子进程就成了僵尸进程,使用该方法需要特别小心这种情况。如果p还保存了一个锁那么也将不会被释放,进而导致死锁
  5. p.is_alive():如果p仍然运行,返回True
  6.  
  7. p.join([timeout]):主线程等待p终止(强调:是主线程处于等的状态,而p是处于运行的状态)。timeout是可选的超时时间,需要强调的是,p.join只能joinstart开启的进程,而不能joinrun开启的进程

  属性介绍:

  1. p.daemon:默认值为False,如果设为True,代表p为后台运行的守护进程,当p的父进程终止时,p也随之终止,并且设定为True后,p不能创建自己的新进程,必须在p.start()之前设置
  2.  
  3. p.name:进程的名称
  4.  
  5. p.pid:进程的pid
  6.  
  7. p.exitcode:进程在运行时为None、如果为–N,表示被信号N结束(了解即可)
  8.  
  9. p.authkey:进程的身份验证键,默认是由os.urandom()随机生成的32字符的字符串。这个键的用途是为涉及网络连接的底层进程间通信提供安全性,这类连接只有在具有相同的身份验证键时才能成功(了解即可)

 示例:

  1. #进程对象的其他方法一:terminate,is_alive
  2. from multiprocessing import Process
  3. import time
  4. import random
  5.  
  6. class Piao(Process):
  7. def __init__(self,name):
  8. self.name=name
  9. super().__init__()
  10.  
  11. def run(self):
  12. print('%s is piaoing' %self.name)
  13. time.sleep(random.randrange(1,5))
  14. print('%s is piao end' %self.name)
  15.  
  16. p1=Piao('egon1')
  17. p1.start()
  18.  
  19. p1.terminate()#关闭进程,不会立即关闭,所以is_alive立刻查看的结果可能还是存活
  20. print(p1.is_alive()) #结果为True
  21.  
  22. print('开始')
  23. print(p1.is_alive()) #结果为False

注意了:p.join(),是父进程在等p的结束,是父进程阻塞在原地,而p仍然在后台运行

  1. #进程对象的其他方法二:p.daemon=True,p.join
  2. from multiprocessing import Process
  3. import time
  4. import random
  5.  
  6. class Piao(Process):
  7. def __init__(self,name):
  8. self.name=name
  9. super().__init__()
  10. def run(self):
  11. print('%s is piaoing' %self.name)
  12. time.sleep(random.randrange(1,3))
  13. print('%s is piao end' %self.name)
  14.  
  15. p=Piao('egon')
  16. p.daemon=True #一定要在p.start()前设置,设置p为守护进程,禁止p创建子进程,并且父进程死,p跟着一起死
  17. p.start()
  18. p.join(0.0001) #等待p停止,等0.0001秒就不再等了
  19. print('开始')
  1. #进程对象的其他属性:name,pid
  2. from multiprocessing import Process
  3. import time
  4. import random
  5. class Piao(Process):
  6. def __init__(self,name):
  7. # self.name=name
  8. # super().__init__() #Process的__init__方法会执行self.name=Piao-1,
  9. # #所以加到这里,会覆盖我们的self.name=name
  10.  
  11. #为我们开启的进程设置名字的做法
  12. super().__init__()
  13. self.name=name
  14.  
  15. def run(self):
  16. print('%s is piaoing' %self.name)
  17. time.sleep(random.randrange(1,3))
  18. print('%s is piao end' %self.name)
  19.  
  20. p=Piao('egon')
  21. p.start()
  22. print('开始')
  23. print(p.pid) #查看pid

2.进程池

3.进程通信

4.守护进程

5.进程Queue

Python并发编程-进程的更多相关文章

  1. Python(并发编程进程)

    并发编程 二.多进程 要让Python程序实现多进程(multiprocessing),我们先了解操作系统的相关知识. Unix/Linux操作系统提供了一个fork()系统调用,它非常特殊.普通的函 ...

  2. Python并发编程-进程 线程 同步锁 线程死锁和递归锁

    进程是最小的资源单位,线程是最小的执行单位 一.进程 进程:就是一个程序在一个数据集上的一次动态执行过程. 进程由三部分组成: 1.程序:我们编写的程序用来描述进程要完成哪些功能以及如何完成 2.数据 ...

  3. Python之路【第十六篇】:Python并发编程|进程、线程

    一.进程和线程 进程 假如有两个程序A和B,程序A在执行到一半的过程中,需要读取大量的数据输入(I/O操作), 而此时CPU只能静静地等待任务A读取完数据才能继续执行,这样就白白浪费了CPU资源. 是 ...

  4. python并发编程-进程池线程池-协程-I/O模型-04

    目录 进程池线程池的使用***** 进程池/线程池的创建和提交回调 验证复用池子里的线程或进程 异步回调机制 通过闭包给回调函数添加额外参数(扩展) 协程*** 概念回顾(协程这里再理一下) 如何实现 ...

  5. python并发编程-进程理论-进程方法-守护进程-互斥锁-01

    操作系统发展史(主要的几个阶段) 初始系统 1946年第一台计算机诞生,采用手工操作的方式(用穿孔卡片操作) 同一个房间同一时刻只能运行一个程序,效率极低(操作一两个小时,CPU一两秒可能就运算完了) ...

  6. python 并发编程 进程池与线程池

    一 进程池与线程池 1.为什么需要进程池和线程池 基于多进程或多线程实现并发的套接字通信,然而这种实现方式的致命缺陷是: 服务端的程序运行在一台机器身上,一台机器性能是有极限的,不能无限开线程 服务的 ...

  7. Python并发编程-进程池及异步方式

    进程池的基本概念 为什么有进程池的概念 效率问题 每次开启进程,都需要开启属于这个进程的内存空间 寄存器,堆栈 进程过多,操作系统的调度 进程池 python中的 先创建一个属于进程的池子 这个池子指 ...

  8. Python并发编程-进程池回调函数

    回调函数不能传参数 回调函数是在主进程中执行的 from multiprocessing import Pool import os def func1(n): print('in func1', o ...

  9. Python并发编程-进程池的返回值

    同步或异步获取返回值 #p = Pool() #p.map(funcname,iterable) 默认异步的执行任务,且自带close,join功能 #p.apply(), 同步调用进程池的方法 #p ...

随机推荐

  1. ASP.Net中表单POST到其他页面的方法

    在ASP中,我们通常把表单提交到另外一个页面(接受数据页面).但是在ASP.NET中,服务端表单通常都是提交到本页面的,如果我设置 form1.action="test.aspx" ...

  2. 用Matlab实现字符串分割(split)

    用Matlab实现字符串分割(split)Posted on 2011/08/08 Matlab的字符串处理没有C#强大,本身又没有提供OO特性,需要依赖别的手段完成这项任务. 我们在这里借助正则表达 ...

  3. 【Atcoder】AGC022 C - Remainder Game 搜索

    [题目]C - Remainder Game [题意]给定n个数字的序列A,每次可以选择一个数字k并选择一些数字对k取模,花费2^k的代价.要求最终变成序列B,求最小代价或无解.n<=50,0& ...

  4. PHPMailer发送邮件(一)

    Github 地址:(已更新,适用于旧版) PHPMailer : https://github.com/PHPMailer/PHPMailer 一.基本要求 Web访问正常(apache可以正常访问 ...

  5. Win7下SQLPlus登录时报错"SP2-1503:无法初始化Oracle调用界面"

    Oracle安装完毕,使用SQLPlus登录的时候报错"SP2-1503:无法初始化Oracle调用界面",然后一闪界面关闭,报错界面如下: 这个是因为在Win7需要管理员权限,右 ...

  6. MySQL5.6 新特性之GTID【转】

    转自 MySQL5.6 新特性之GTID - jyzhou - 博客园http://www.cnblogs.com/zhoujinyi/p/4717951.html 背景: MySQL5.6在5.5的 ...

  7. URAL题解二

    URAL题解二 URAL 1082 题目描述:输出程序的输入数据,使得程序输出"Beutiful Vasilisa" solution 一开始只看程序的核心部分,发现是求快排的比较 ...

  8. [转载]FFmpeg完美入门[4] - FFmpeg应用实例

    1 用FFserver从文件生成流媒体 一.安装ffmpeg 在ubuntu下,运行sudo apt-get ffmpeg 安装ffmpeg,在其他linux操作系统下,见ffmpeg的编译过程(编译 ...

  9. Ubuntu下安装Python3.6并在终端输入Python就能显示Python3.6

      Ubuntu17.04自带Python2.7与Python3.5.3的版本,由于Python2与Python3有着一些差距可能需要安装更新Python3的版本,并且切换默认的Python解释器. ...

  10. Ubuntu下安装Sublime Text3

    1. 下载软件 Ctrl+Alt+T 调出命令窗口执行下面命令下载安装包: sudo add-apt-repository ppa:webupd8team/sublime-text-3 2. 更新软件 ...