Python里执行并发有进程和线程两个,分布使用 threading 和multiprocessing 两个库,一般用的是这两个库里的Thread和Process

from threading import Thread   # 线程 : 同时运行from multiprocessing import Process  # 进程

进程和线程的使用场景:

1. 一般在有大量的数据(耗时)操作的时候,会用到线程和进程

2.python里要优先用进程,因为Python里的线程有个自带的bug,全局解释器锁

示例1:有大猫和小猫睡觉的两个模拟耗时的操作,如果不用并发,执行效果就是从上到下顺序 串行执行的

from threading import Thread   # 线程 : 同时运行
import time, random# 模拟耗时操作:大猫和小猫睡觉
def daMaoSleep(n):print("大猫开始睡觉了,它要睡{}秒".format(n) )time.sleep(n)print("现在大猫睡醒了")def xiaoMaoSleep(n):print("小猫开始睡觉了,它要睡{}秒".format(n) )time.sleep(n)print("现在小猫睡醒了")if __name__ == '__main__':# 不适用线程和进程,是顺序串行的n_da = random.randint(3,5)n_xiao = random.randint(3,6)# 使用线程库进行并行,注意target是函数名,args是参数,参数必须是元组# target=传参是要运行的函数,args=(n,) args是个元组,如果只有一个参数,要带逗号的# 使用线程库进行并行,注意target是函数名,args是参数,参数必须是元组# 执行大猫睡觉thread = Thread(target=daMaoSleep,args=(n_da,))thread.start()# 执行小猫睡觉thread = Thread(target=xiaoMaoSleep,args=(n_xiao,))thread.start()# 输出
大猫开始睡觉了,它要睡4秒
小猫开始睡觉了,它要睡3秒
现在小猫睡醒了
现在大猫睡醒了

示例2:如果想让大猫和小猫同时开始睡觉,怎么操作呢?

这里用线程的方式实现并发演示

from multiprocessing import Process  # 进程
import time, random# 模拟耗时操作:大猫和小猫睡觉
def daMaoSleep(n):print("大猫开始睡觉了,它要睡{}秒".format(n) )time.sleep(n)print("现在大猫睡醒了")def xiaoMaoSleep(n):print("小猫开始睡觉了,它要睡{}秒".format(n) )time.sleep(n)print("现在小猫睡醒了")if __name__ == '__main__':n_da = random.randint(3,5)n_xiao = random.randint(3,6)# 使用进程库进行并行,注意target是函数名,args是参数,参数必须是元组# target=传参是要运行的函数,args=(n,) args是个元组,如果只有一个参数,要带逗号的# 使用进程库进行并行,注意target是函数名,args是参数,参数必须是元组# 执行大猫睡觉process = Process(target=daMaoSleep,args=(n_da,))process.start()# 执行小猫睡觉process = Process(target=xiaoMaoSleep,args=(n_xiao,))process.start()# 输出
大猫开始睡觉了,它要睡4秒
小猫开始睡觉了,它要睡3秒
现在小猫睡醒了
现在大猫睡醒了

注意避免踩坑:进程和线程一定要写在 if __name__ == '__main__' 里面的,否则会报错

进程与线程的区别:

什么是进程,什么是线程

系统要做一件事,运行一个任务,所有运行的任务通常就是一个程序;

每个运行中的程序就是一个进程,这一点在任务管理器上面可以形象的看到。

当一个程序运行时,内部可能会包含多个顺序执行流,每个顺序执行流就是一个线程。

关于进程的特性

独立性:进程是系统中独立存在的实体,它可以拥有自己独立的资源,每个进程都拥有自己私有的地址空间。在没有经过进程本身运行的情况下是不能访问其中的内容的。

动态性:进程与程序的区别在于,程序是静态的,进程是动态的。程序只是一个静态的指令集合,而进程是一个正在系统中运行的指令集合。有了时间的概念,如生命周期;

并发性:进程之间,交替着执行。

线程,一个顺序执行流;

它是进程的组成部分,一个进程可以有多个线程。

关于线程的特性,或是它的优势

1、进程之间不能共享内存,单线程之间共享内存非常的容易

2、系统创建进程需要为该进程重新分配系统资源,但创建线程的代价很小。因此多线程的实现多任务并发比多进程实现并发的效率高

3、java语言内置多线程功能支持,而不是单纯的作为底层操作系统的调度方式

 

总结:

一个程序运行至少一个进程,一个进程里面至少包含一个线程,线程是进程的组成部分。

线程相对于进程而言,很强大了,做到了资源的共享,资源的损耗降低,人为的手工控制程序的运行。

多进程通信的方式有哪些?
1. 共享内存
2. 信号
3. 信号量
4. 管道
5. socket通信

多线程的通信方式有哪些?
因为线程运作在进程里里面,所以多线程的通信方式也就是多线程的通信方式

不过,总的来说,目前进程和线程已经过时了,当前主流的处理方式都用消息队列实现

 

 

转载于:https://www.cnblogs.com/victorm/p/11326366.html

第九篇 并发(进程和线程)相关推荐

  1. Python 第八篇:异常处理、Socket语法、SocketServer实现多并发、进程和线程、线程锁、GIL、Event、信号量、进程间通讯...

    本节内容: 异常处理.Socket语法.SocketServer实现多并发.进程和线程.线程锁.GIL.Event.信号量.进程间通讯.生产者消费者模型.队列Queue.multiprocess实例 ...

  2. Java并发篇_进程线程

    一个进程包括由操作系统分配的内存空间,包含一个或多个线程.一个线程不能独立的存在,它必须是进程的一部分.一个进程一直运行,直到所有的非守护线程都结束运行后才能结束. 多线程能满足程序员编写高效率的程序 ...

  3. java io 并发编程,JAVA进阶系列 - 并发编程 - 第1篇:进程线程并发并行

    学习目标进程 线程 并发 并行 内容 一.进程与线程 "专业"点的说法就是:进程是资源分配的最小单位,线程是CPU调度的最小单位. 大哥,我错了,别打脸! 进程 线程就是用来加载指 ...

  4. C++11多线程第一篇:并发基本概念及实现,进程、线程基本概念

    文章目录 1.并发基本概念及实现,进程.线程基本概念 1.1 并发.进程.线程的基本概念和综述 1.1.1 并发.并行 1.1.2 可执行程序 1.1.3 进程 1.1.4 线程 1.1.5 程序.进 ...

  5. 【Java扫盲篇】今天用人话给你讲清楚:进程、线程、并发、并行、高并发?

    在这里你可以了解: 为啥大家说的进程的意思有出入? 为啥并发那么难理解? 为啥高并发不仅仅是 "高"+"并发" 的意思? 为啥这些概念到了现实当中就不一样了? ...

  6. Python基础 - 第九天 - paramiko模块、进程、线程

    本篇内容: 1.paramiko模块使用 2.进程.线程简介 3.python调用线程的方法 4.join - 等待线程执行 5.守护线程 6.GIL - 全局解释器锁 7.互斥锁 8.信号量 9.事 ...

  7. c++ 线程池_基础篇:高并发一瞥,线程和线程池的总结

    进程是执行程序的实体,拥有独属的进程空间(内存.磁盘等).而线程是进程的一个执行流程,一个进程可包含多个线程,共享该进程的所有资源:代码段,数据段(全局变量和静态变量),堆存储:但每个线程拥有自己的执 ...

  8. [Qt教程] 第39篇 网络(九)进程和线程

    [Qt教程] 第39篇 网络(九)进程和线程 楼主  发表于 2013-8-29 15:48:56 | 查看: 415| 回复: 0 进程和线程 版权声明 该文章原创于作者yafeilinux,转载请 ...

  9. python爬虫进程和线程_python爬虫番外篇(一)进程,线程的初步了解-阿里云开发者社区...

    整理这番外篇的原因是希望能够让爬虫的朋友更加理解这块内容,因为爬虫爬取数据可能很简单,但是如何高效持久的爬,利用进程,线程,以及异步IO,其实很多人和我一样,故整理此系列番外篇 一.进程 程序并不能单 ...

最新文章

  1. 在C语言中break语句称为,在C语言中,break语句的功能是退出函数
  2. 《强化学习周刊》第29期:Atari 深度强化学习的研究综述、金融强化学习的最新进展...
  3. 利用隐藏神经元解决异或问题的小型示例程序
  4. C#中怎样跨窗体调用事件-从事件订阅实例入手
  5. 用静态工厂方法代替构造器
  6. 如何通过SQL按内容拆分字段(将一个字段值拆分两个字段)
  7. 首个由国内发起的分布式消息领域的国际标准OpenMessaging一周年回顾
  8. 深入对比数据科学工具箱:Python和R的异常处理机制
  9. Java高级语法笔记-文件读写
  10. 排序1+3:基数排序(RadixSort),希尔排序(ShellSort)和快速排序(QuickSort)
  11. linux——网络情报收集(总结篇.干货+实战)
  12. android ndk下载安装教程,NDK安装教程20180605
  13. 最新的ARM-GCC下载安装指南
  14. 收银系统源码,又又升级最新下载sass版了
  15. 清除默认浏览器CSS样式
  16. [R]_使用mutate_all(),mutate_at(),mutate_if()操纵数据框的列
  17. 七年级认识计算机软件教案,七年级信息技术第三单元 第一节认识计算机网络教案.doc...
  18. 【算法思想:回溯法】回溯算法入门级详解
  19. 乐谱学习软件:iReal Pro for Mac
  20. 小米重大变革:成立十个一级部门大量启用80后 向雷军汇报

热门文章

  1. 转:JNI jstring与c++字符串类型转换函数
  2. WebHelper类
  3. ft服务器设置传输协议,ft服务器设置成主动模式
  4. 网上linux实验平台,Linux操作系统实验教程
  5. python web.py 404_找不到web.py开发服务器-favicon.ico-404
  6. django 日志写入mysql_如何将django orm模型 写入数据库
  7. 力扣反转字符串中的元音字母
  8. 7-3 逆序的三位数 (10 分)
  9. C++使用JSON的序列化与反序列化
  10. c#中 uint_C#中的uint关键字