什么是线程?
程序执行的最小单位
线程是进程中的一个实体,是被系统独立调度和分派的基本单位

线程的创建
threading.Thread(target = 变量名)

线程的资源竞争问题
线程是可以资源共享的同时也会存在问题就是资源竞争
为了防止这种问题的出现,就提出了锁的概念

互斥锁
某个线程要更改共享数据时,先将其锁定,此时资源的状态为“锁定”,其他线程不能更改;
直到该线程释放资源,将资源的状态变成“非锁定”,其他的线程才能再次锁定该资源

#threading 模块中定义了 Lock 类,可以方便的处理锁定:
# 创建锁
mutex = threading.Lock()
# 锁定
mutex.acquire()
# 释放
mutex.release()

锁里的内容越少越好

锁的好处:
确保了某段关键代码只能由一个线程从头到尾完整地执行
锁的坏处:
阻止了多线程并发执行,包含锁的某段代码实际上只能以单线程模式执行,效率就大大地下
降了。
由于可以存在多个锁,不同的线程持有不同的锁,并试图获取对方持有的锁时,可能会造成
死锁。

死锁
在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资
源,就会造成死锁

什么是进程?
进程是程序的一次执行
进程是可以和别的计算并行执行
进程是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位

进程的创建
multiprocessing.Process(target=变量名)

进程间不同享全局变量
这个时候就出现了Queue
可以使用 multiprocessing 模块的 Queue 实现多进程之间的数据传递,Queue 本身是一个消
息列队程序。put() 放入元素,get()取出元素

#返回当前队列包含的消息数量;
Queue.qsize()
#如果队列为空,返回 True,反之 False ;
Queue.empty()
#如果队列满了,返回 True,反之 False;
Queue.full()
#获取队列中的一条消息,然后将其从列队中移除,block 默认
Queue.get([block[, timeout]])

进程池 Pool
手动的去创建进程的工作量巨大,此时就可以用到
multiprocessing 模块提供的 Pool 方法。
初始化 Pool 时,可以指定一个最大进程数,当有新的请求提交到 Pool 中时,如果池还没有
满,那么就会创建一个新的进程用来执行该请求;但如果池中的进程数已经达到指定的最大
值,那么该请求就会等待,直到池中有进程结束,才会用之前的进程来执行新的任务。

po = Pool(3) # 定义一个进程池,最大进程数 3
for i in range(0,10):
# Pool().apply_async(要调用的目标,(传递给目标的参数元祖,))
# 每次循环将会用空闲出来的子进程去调用目标
po.apply_async(worker,(i,))
print("----start----")
po.close() # 关闭进程池,关闭后 po 不再接收新的请求
po.join() # 等待 po 中所有子进程执行完成,必须放在 close 语句之后
print("-----end-----")

什么是协程?
协程是一种用户态的轻量级线程
协程的调度完全由用户控制
协程拥有自己的寄存器和栈

网上抓取图片实例:

import urllib.request
import gevent
from gevent import monkey

def download(img_name,img_url):

req = urllib.request.urlopen(img_url)

img_content = req.read()

with open(img_name, "wb") as f:
f.write(img_content)

def main():

gevent.joinall([

gevent.spawn(download,"3.png","https://rpic.douyucdn.cn/live-cover/appCovers/2018/10/18/5051688_20181018115702_small.jpg "),
gevent.spawn(download,"4.png","https://rpic.douyucdn.cn/live-cover/appCovers/2018/11/20/4902933_20181120204919_small.jpg")

]
)

if __name__ == '__main__':
main()

进程、线程和协程的区别?

一个程序至少有一个进程,一个进程至少有一个线程.
线程的划分尺度小于进程(资源比进程少),使得多线程程序的并发性高。
进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程
序的运行效率
线程不能够独立执行,必须依存在进程中
一个线程可以多个协程,一个进程也可以单独拥有多个协程
.线程进程都是同步机制,协程是异步.线程进程都是同步机制,协程是异步

来源:CSDN
原文:https://blog.csdn.net/qq_43454410/article/details/84581623

Python进程、线程、协成的更多相关文章

  1. Python 进程线程协程 GIL 闭包 与高阶函数(五)

    Python 进程线程协程 GIL 闭包 与高阶函数(五) 1 GIL线程全局锁 ​ 线程全局锁(Global Interpreter Lock),即Python为了保证线程安全而采取的独立线程运行的 ...

  2. python基础26 -----python进程及协成

    一.进程 1.multiprocessing模块实现多进程并发. 1.1multiprocessing包是Python中的多进程管理包,与threading.Thread类似,它可以利用multipr ...

  3. python -- 进程线程协程专题

    进程专栏 multiprocessing 高级模块 要让Python程序实现多进程(multiprocessing),我们先了解操作系统的相关知识. Unix/Linux操作系统提供了一个fork() ...

  4. python 进程 线程 协程

    并发与并行:并行是指两个或者多个事件在同一时刻发生:而并发是指两个或多个事件在同一时间间隔内发生.在单核CPU下的多线程其实都只是并发,不是并行. 进程是系统资源分配的最小单位,进程的出现是为了更好的 ...

  5. python进程/线程/协程

    一 背景知识 顾名思义,进程即正在执行的一个过程.进程是对正在运行程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的其他所 ...

  6. python 进程/线程/协程 测试

    # Author: yeshengbao # -- coding: utf-8 -- # @Time : 2018/5/24 21:38 # 进程:如一个人拥有分身(分数数最好为cpu核心数)几乎同时 ...

  7. python自动化开发学习 进程, 线程, 协程

    python自动化开发学习 进程, 线程, 协程   前言 在过去单核CPU也可以执行多任务,操作系统轮流让各个任务交替执行,任务1执行0.01秒,切换任务2,任务2执行0.01秒,在切换到任务3,这 ...

  8. Python并发编程系列之常用概念剖析:并行 串行 并发 同步 异步 阻塞 非阻塞 进程 线程 协程

    1 引言 并发.并行.串行.同步.异步.阻塞.非阻塞.进程.线程.协程是并发编程中的常见概念,相似却也有却不尽相同,令人头痛,这一篇博文中我们来区分一下这些概念. 2 并发与并行 在解释并发与并行之前 ...

  9. 进程&线程&协程

    进程  一.基本概念 进程是系统资源分配的最小单位, 程序隔离的边界系统由一个个进程(程序)组成.一般情况下,包括文本区域(text region).数据区域(data region)和堆栈(stac ...

  10. 多道技术 进程 线程 协程 GIL锁 同步异步 高并发的解决方案 生产者消费者模型

    本文基本内容 多道技术 进程 线程 协程 并发 多线程 多进程 线程池 进程池 GIL锁 互斥锁 网络IO 同步 异步等 实现高并发的几种方式 协程:单线程实现并发 一 多道技术 产生背景 所有程序串 ...

随机推荐

  1. docker容器的操作

    容器操作 1.查看本地容器 docker ps -a # 查看所有容器 docker ps # 查看所有正在运行的容器 2.容器的创建与启动 方法一:两步完成(强烈推荐方法)(1)创建 docker ...

  2. 【查阅】教你使用SQL SERVER复制

    关键词:复制,复制总结,复制汇总,复制查阅 1.概念与搭建 Step1:SQL SERVER复制介绍 Step2:SQL Server 复制事务发布 Step3:SQL Server 通过备份文件初始 ...

  3. java框架之Spring(1)-入门

    介绍 概述 Spring 是一个开放源代码的设计层面框架,它解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用.Spring 是于 2003 年兴起的一个轻量级的 J ...

  4. shmdt() 与 shmctl() 的区别?

    操作共享内存,我们用到了下面的函数 ============================================== #include <sys/types.h> #inclu ...

  5. [转]有return的情况下try catch finally的执行顺序

    结论: 1.不管有没有出现异常,finally块中代码都会执行: 2.当try和catch中有return时,finally仍然会执行: 3.finally是在return后面的表达式运算后执行的(此 ...

  6. cocos2d-x JS 重力感应监听事件

    说明 : 下面监听中的 acc属性 里面有很多可以使用的值 . 添加监听 : cc.inputManager.setAccelerometerEnabled(true); cc.eventManage ...

  7. cocos2d-js:游戏进入后台和返回游戏的事件捕获和处理

    cocos2d-js 3.x处理 游戏置入后台和返回游戏的事件处理很方便 只需通过事件管理类cc.eventManager,自定义一个监听事件即可 代码如下 cc.eventManager.addCu ...

  8. 前端学习历程--js--原型&闭包

    一.数据类型 1.值类型:undefined, number, string, boolean,不是对象 2.引用类型:函数.数组.对象.null.new Number(10)都是对象 3.引用类型判 ...

  9. sourcetree 免注册

    http://www.cnblogs.com/xiofee/p/sourcetree_pass_initialization_setup.htmlSourceTree 安装之后需要使用账号登陆以授权, ...

  10. HTML和CSS总结

    语义化.我们学习网页制作时,常常会听到一个词,语义化.那么什么叫做语义化呢,说的通俗点就是:明白每个标签的用途(在什么情况下使用此标签合理)比如,网页上的文章的标题就可以用标题标签,网页上的各个栏目的 ...