python 多进程和多线程


一、进程和线程

1、概念

进程: 一个进程就是一个任务,可以理解为一个程序。一个进程可以有多个线程,至少一个。多进程中,同一个变量,各自有一份拷贝存在于每个进程中,互不影响。
线程: 多线程中,所有变量都由所有线程共享,任何一个变量都可以被任何一个线程修改。

2、优缺点

进程: 创建进程开销(时间和空间)较大,一个子进程崩溃了,不会影响主进程和其他子进程。

线程: 创建线程开销(时间和空间)相对较小,任何一个线程挂掉都可能直接造成整个进程崩溃。


二、多进程

1、使用多进程

from multiprocessing import Process
import osdef run_proc(name):"""子进程函数"""print('Run child process %s: %s...' % (name, os.getpid()))if __name__ == '__main__':# 主进程 idprint('Parent process: %s.' % os.getpid())# 创建子进程p = Process(target=run_proc, args=('test',))print('Child process will start.')# 开启子进程p.start()# 等待子进程运行结束p.join()print('Child process end.')

2、进程池

from multiprocessing import Pool
import os
import time
import randomdef task(name):"""任务函数"""print('Run task %s : %s...' % (name, os.getpid()))start = time.time()time.sleep(random.random() * 3)end = time.time()print('Task %s runs %0.2f seconds.' % (name, (end - start)))if __name__ == '__main__':# 主进程 idprint('Parent process %s.' % os.getpid())# 指定进程池中进程最大个数,默认为电脑的核数p = Pool(4)# 同时开启 5 个进程for i in range(5):p.apply_async(task, args=(i,))print('Waiting for all subprocesses done...')# 关闭线程池,不再继续添加新的Processp.close()# 等待所有子进程执行完毕p.join()print('All subprocesses done.')

3、进程间通信:Queue

from multiprocessing import Process, Queue
import os
import time
import randomdef write(q):"""添加数据到队列中"""print('Process to write: %s' % os.getpid())for value in ['A', 'B', 'C']:print('Put %s to queue...' % value)q.put(value)time.sleep(random.random())def read(q):"""从队列中读取数据"""print('Process to read: %s' % os.getpid())while True:# 读取数据,队列为空时,True:会进入等待状态,直到超时,False:抛出 Empty 异常value = q.get(True)print('Get %s from queue.' % value)if __name__ == '__main__':# 父进程创建Queue,并传给各个子进程:q = Queue()# 创建两个进程pw = Process(target=write, args=(q,))pr = Process(target=read, args=(q,))# 启动子进程 pw 写入pw.start()# 启动子进程 pr 读取pr.start()# 等待 pw 结束:pw.join()# pr进程是死循环,无法等待其结束,只能强行终止:pr.terminate()

三、多线程

1、使用多线程

import threading
import timedef loop():"""子线程任务函数"""print('thread %s is running...' % threading.current_thread().name)time.sleep(2)print('thread %s ended.' % threading.current_thread().name)if __name__ == '__main__':# 主线程名print('thread %s is running...' % threading.current_thread().name)# 创建子线程t = threading.Thread(target=loop, name='LoopThread')# 开启子线程t.start()# 等待子线程运行完毕t.join()print('thread %s ended.' % threading.current_thread().name)

2、线程锁

import threadingbalance = 0
lock = threading.Lock()def change_it(n):"""先加后减,结果应该为 0"""global balancebalance = balance + nbalance = balance - ndef run_thread(n):"""子线程任务函数"""for i in range(100000):# 先要获取锁lock.acquire()try:# 只有获得锁的线程才能进行调用change_it(n)finally:# 用完一定要释放锁,这样别的线程才有机会使用lock.release()if __name__ == '__main__':# 创建线程t1 = threading.Thread(target=run_thread, args=(5,))t2 = threading.Thread(target=run_thread, args=(8,))# 开启线程t1.start()t2.start()# 线程阻塞t1.join()t2.join()print(balance)

3、全局锁:GIL 锁

  • Python的线程虽然是真正的线程,但解释器执行代码时,有一个GIL锁:Global Interpreter Lock,任何Python线程执行前,必须先获得GIL锁,然后,每执行100条字节码,解释器就自动释放GIL锁,让别的线程有机会执行。这个GIL全局锁实际上把所有线程的执行代码都给上了锁,所以,多线程在Python中只能交替执行,即使100个线程跑在100核CPU上,也只能用到1个核。
  • Python 虽然不能利用多线程实现多核任务,但可以通过多进程实现多核任务。多个Python 进程有各自独立的GIL锁,互不影响。

4、线程自己的全局变量:ThreadLocal

import threading# 创建全局 ThreadLocal 对象
local_school = threading.local()def process_student():"""获取当前线程关联的全局变量 student"""# 获得各自线程的全局变量std = local_school.studentprint('Hello, %s (in %s)' % (std, threading.current_thread().name))def process_thread(name):"""子线程任务函数"""# 绑定 ThreadLocal 的student:local_school.student = nameprocess_student()if __name__ == '__main__':t1 = threading.Thread(target=process_thread, args=('A',), name='Thread-A')t2 = threading.Thread(target=process_thread, args=('B',), name='Thread-B')t1.start()t2.start()t1.join()t2.join()>>> Hello, A (in Thread-A)Hello, B (in Thread-B)

GOOD LUCK!


python 多进程和多线程相关推荐

  1. 一文看懂Python多进程与多线程编程(工作学习面试必读)

    进程(process)和线程(thread)是非常抽象的概念, 也是程序员必需掌握的核心知识.多进程和多线程编程对于代码的并发执行,提升代码效率和缩短运行时间至关重要.小编我今天就来尝试下用一文总结下 ...

  2. 【干货】python多进程和多线程谁更快

    python多进程和多线程谁更快 python3.6 threading和multiprocessing 自从用多进程和多线程进行编程,一致没搞懂到底谁更快.网上很多都说python多进程更快,因为G ...

  3. Python多进程和多线程的使用场景

    Python多进程适用的场景:计算密集型(CPU密集型)任务 Python多线程适用的场景:IO密集型任务 计算密集型任务一般指需要做大量的逻辑运算,比如上亿次的加减乘除,使用多核CPU可以并发提高计 ...

  4. python多进程与多线程使用

    简介 关于多进程和多线程的详细介绍参考其他资料,这里仅列出一些显著特征,用于帮助实际使用时选择哪种方法. 多线程 多线程之间共享内存和变量: 创建线程总体资源消耗较低: 由于GIL锁,只能使用单核,性 ...

  5. python多进程和多线程看这一篇就够了

    脑海中关于进程和线程的概念一直很模糊,什么时候该用多进程,什么时候该用多线程总是搞不清楚.同时python因为历史遗留问题存在GIL全局锁,就让人更加困惑.这一篇就完整整理一下python中进程和线程 ...

  6. python多进程和多线程一起使用_Python干货:多进程与多线程!

    今天我们来聊聊Python里面的多进程与多线程编程模式. 01 多线程工作 在开始讲今天的正文之前,先给大家介绍一个概念「多线程工作」,这个概念可能有的人听过,也可能有的人平常工作中就是这么做的.我再 ...

  7. python多进程、多线程

    1.python多线程 使用一个例子来学习多线程.建议自己敲一遍. python多线程是通过threading模块的Thread实现. 创建线程对象 t = thread.Thread() 启动线程 ...

  8. Python多进程、多线程编程

    文章目录 1. 进程.线程.协程 2. Python多线程 GIL全局解释器锁 CPython科普 3. Python:多进程 or 多线程 计算密集型.I/O密集型科普 4. 编程实战 1. 进程. ...

  9. Python 多进程、多线程启动

    本文仅供学习交流使用,如侵立删!demo下载见文末 Python 多进程启动 def main(self, num):"""多进程启动ValueError: Pool n ...

最新文章

  1. npm 安装less插件_Gulp 开发 HTML 静态页面和 Less 实时更新
  2. 卷积Groups Group Convolutions
  3. springboot创建项目(通过spring官网)详细
  4. python mysql library popular_python之mysql入门详解(四)
  5. SkyWalking8.1.0 部署和使用
  6. 消息驱动 微服务器,消息驱动的微服务-Spring Cloud Stream整合RocketMQ
  7. MySQL的一些常用命令
  8. HTTP基础(图解HTTP笔记)幕布
  9. linux的使用 --- 安装node和express
  10. 人脸数据库汇总 (来自网络)
  11. Facial Expression Recognition
  12. LabVIEW 编程更改波形图Plots是否可见
  13. android 图片轮播控
  14. 用Python提取图片主要颜色
  15. android 多个catch,【Android开发坑系列】之try-catch
  16. CICE海冰模式的编译
  17. wrcoef2函数_matlab中二维小波变换部分函数
  18. codeforces 546B Soldier and Badges
  19. 提示the windows installer service could not be accessed
  20. 用unity 做一个转盘游戏

热门文章

  1. 最短路问题之Bellman-ford算法
  2. [SDOI2010]外星千足虫 题解 高斯消元+bitset简介
  3. 锋利的jQuery--关于$(document).ready()函数及jQuery代码风格
  4. C#通过获取快捷方式指向目标的小示例触碰WMI
  5. Visual Studio 2008 和 .NET Framework 3.5 Service Pack 1 Beta 发布
  6. 032-session函数
  7. AssetBundle
  8. 使用cert-manager实现Ingress https
  9. Unity3D GUI中的图片尾随鼠标旋转脚本
  10. MySQL数据类型--日期时间