今日内容:

  1、进程间互相通信(IPC机制)

  2、生产者消费者模型

  3、线程理论

  4、线程开启的两种方式

  5、线程相关属性方法

  6、守护线程

  7、线程互斥锁

1、进程间相互通信(IPC机制)

  主要是一个关于队列的知识:队列=管道+锁

  进程彼此之间互相隔离,要实现进程间通信(IPC),multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的

  Queue([maxsize]):创建共享的进程队列,Queue是多进程安全的队列,可以使用Queue实现多进程之间的数据传递。

  maxsize:是指该队列中最大存放个数,省略则为无限大小

q = Queue(4)#生成了一个q队列,该队列最大存放的个数为4
q.put('XX')#往队列里存了第一个值
q.put('DSB')
q.put('爱吃')
q.put('香肠') print(q.get())#从队列里取出第一个值并且删除该值,队列遵行的是先进先出
print(q.get())
print(q.get())
print(q.get())

  其中q.put('XX',block = True,timeout=3)block为True(默认值)时,并且timeout为正值,该方法会阻塞timeout指定的时间,直到该队列的空间有剩余,如果超时,则会抛出Queue.Full异常。如果blocked为False,但该队列已满,会立即抛出Queue.Full异常。

  相同get方法有两个可选参数:blocked和timeout。如果blocked为True(默认值),并且timeout为正值,那么在等待时间内没有取到任何元素,会抛出Queue.Empty异常。如果blocked为False,有两种情况存在,如果Queue有一个值可用,则立即返回该值,否则,如果队列为空,则立即抛出Queue.Empty异常.

  q.get_nowait():同q.get(False)
  q.put_nowait():同q.put(False)

2、生产者和消费者模式

  在并发编程中使用生产者和消费者模式能够解决大多数并发问题,该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度。

  在线程世界里,生产者就是生产数据的线程,消费者就是处理数据的线程。在多线程开发当中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据。同样的道理,如果消费者的处理能力大于生产者,那么消费者就必须等待生产者,为了解决这个问题于是引入了生产者和消费者模式。

  生产者和消费者模式是通过一个容器来解决生产者和消费者的解耦和问题,生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列相当于一个缓冲区,平衡了生产者和消费者的处理能力。

from multiprocessing import Process,Queue
import time,random,os
def consumer(q):
while True:
res=q.get()
time.sleep(random.randint(1,3))
print('\033[45m%s 吃 %s\033[0m' %(os.getpid(),res)) def producer(q):
for i in range(10):
time.sleep(random.randint(1,3))
res='包子%s' %i
q.put(res)
print('\033[44m%s 生产了 %s\033[0m' %(os.getpid(),res)) if __name__ == '__main__':
q=Queue()
p1=Process(target=producer,args=(q,))
c1=Process(target=consumer,args=(q,))
#开始
p1.start()
c1.start()
print('主')

  

4、线程的介绍:

  进程其实是一种资源单位,而线程是一种处理cpu代码的单位

  线程其实就是处理代码的过程

  线程VS进程

    1、统一进程下多个线程共享该进程的资源

    2、创建线程的开销远远小于创建进程的开销

3、线程的两种开启方式

方式一:利用threading模块创建线程

from threading import Thread
import time
def task (name):
print('%s is running'%name)
time.sleep(2)
print('%s is done'%name) if __name__ == '__main__':
p = Thread(target=task,args=('子线程',))
p.start()
print('主')

  

方式二:利用自定义类通过继承threading下的Thread来创建线程

from threading import Thread
import time
class Mythread(Thread):
def run(self):
print('%s is running'%self.name)
time.sleep(2)
print('%s is done'%self.name) if __name__ == '__main__':
p = Mythread()
p.start()
print('主')

  

5、线程相关属性方法

  当某些同属于一个进程下的线程可以共享该进程的资源。

解释代码:

from threading import Thread
import time,random n = 100
def task():
global n
n=0 if __name__ == '__main__':
p = Thread(target=task)
p.start()
p.join()
print(n)

  

  可以通过调用OS模块,并通过调用其模块下的.getpid()方法可以查看的其线程的pid号(线程的pid号和该线程所属的进程的pid号相同)

from threading import Thread

import os

def task(name):
print('%s is running'%name,os.getpid()) if __name__ == '__main__':
p = Thread(target=task,args=('子线程',))
p.start()
p.join()
print('主',os.getpid())

  可以通过导入threading模块下的active_count,可以查看调用时正在执行的线程数量

from threading import Thread,active_count

import os

def task(name):
print('%s is running'%name,os.getpid()) if __name__ == '__main__':
p = Thread(target=task,args=('子线程',))
p.start()
# time.sleep(1)
print('主',active_count())

  可以通过导入threading模块下的current_thread,查看该线程的一些属性

from threading import Thread,active_count,current_thread
import time,random
import os def task():
print('%s is running'%current_thread().name) if __name__ == '__main__':
p = Thread(target=task)
p.start()
time.sleep(1)
print('主',active_count())

  

6、守护线程

  对于主线程来说,运行完毕值得是主线程所在的进程内所有非守护线程统统运行完毕,主线程才算运行完毕

  主线程在其他非守护线程运行完毕后才算运行完毕(守护线程在此时就会被回收)。因为主线程的结束意味着进程的结束,进程整体资源都将会被回收,而进程必须保证非守护线程都运行完毕才能结束

from threading import Thread
import time def task(name):
print('老奴%s存活'%name)
time.sleep(3)
print('老奴%s正常死亡'%name) if __name__ == '__main__':
p = Thread(target=task,args=('阿张',))
p.daemon = True
p.start()
time.sleep(4)
print('主')

 

7、线程互斥锁

  由于在同一进程下多个线程能共享此进程的资源,所以如果多个线程要对一个数据进行更改,又由于创建一个线程的时间是很少的大概就是创建一个进程的百分之一的时间,所以就很有可能导致两个或多个线程在同一时间内操作一个数据,这样就会导致数据不安全,所以我们需要将更改数据的这一串代码加锁,加锁的作用就是让原本并发的线程在运行这一段加锁的代码是变成串行,这样就保证了数据的安全性。

from threading import Thread,Lock
import time
mutex = Lock()
n=100
def task():
global n
mutex.acquire()
time.sleep(0.1)
n-=1
mutex.release() if __name__ == '__main__': p_l =[]
for i in range(100):
p = Thread(target=task)
p_l.append(p)
p.start()
for i in p_l:
i.join()
print(n)
print('主')

  

day35的更多相关文章

  1. Spark Streaming揭秘 Day35 Spark core思考

    Spark Streaming揭秘 Day35 Spark core思考 Spark上的子框架,都是后来加上去的.都是在Spark core上完成的,所有框架一切的实现最终还是由Spark core来 ...

  2. Activity是如何挂载Pargment的Day35

    Activity是如何挂载Pargment的Day35 mebile5.0 1.Fragment优化早上任务 思路 一个主Activity 短信群发器 中秋给朋友发短信,都能够加上他们的姓名,这样他们 ...

  3. python 全栈开发,Day35(TCP协议 粘包现象 和解决方案)

    一.TCP协议 粘包现象 和解决方案 黏包现象让我们基于tcp先制作一个远程执行命令的程序(命令ls -l ; lllllll ; pwd)执行远程命令的模块 需要用到模块subprocess sub ...

  4. day35 爬虫简述

    爬虫概要 - pip3 install requests - pip3 install beautifulsoup4 基本爬虫: - Python实现浏览器行为,requests - beautifu ...

  5. day35——生产者消费者模型、线程

    day35 进程:生产者消费者模型 编程思想,模型,设计模式,理论等等,都是交给你一种编程的方法,以后你遇到类似的情况,套用即可 生产者消费者模型的三要素 生产者:产生数据的 消费者:接收数据做进一步 ...

  6. day35 守护进程、互斥锁、IPC

    day35 守护进程.互斥锁.IPC 1.守护进程 # 守护进程:当父进程执行完毕后,设置的守护进程也会跟着结束# 当一个进程被设置为守护进程后,其不能再产生子进程​ from multiproces ...

  7. day35前端基础之BOM和DOM

    day35前端基础之BOM和DOM BOM操作 简介 BOM(Browser Object Model)是指浏览器对象模型,它使 JavaScript 有能力与浏览器进行"对话". ...

  8. 不一样的是不一样的,我的独家滚动条------Day35

    在您开始建立自己的,感觉应该先录一个概念:内核的浏览器. 兼容性问题之前多次提及,而在平时经常会遇到兼容性问题.原因,就在于它:浏览器内核.这是比較通俗的说法,事实上应该把它描写叙述的专业点:Rend ...

  9. Python:Day35 mysql基础

    一.数据库管理系统DBMS 软件,存储数据 认证,授权,限制 SqlServer --- 微软(收费) Oracle,sqlite,access...MySQL 服务端和客户端 想要使用MySQL来存 ...

  10. day35 数据库介绍和初识sql

    今日内容: 1. 代码: 简易版socketsever 2.数据库(mysql)简单介绍和分类介绍 3.mysql root修改密码 4.修改字符集编码 5.初识sql语句 1.简易版socketse ...

随机推荐

  1. javascript 数组求交集/差集/并集/过滤重复

    最近在小一个小程序项目,突然发现 javscript 对数组支持不是很好,连这些基本的功能,都还要自己封装.网上查了下,再结合自己的想法,封装了一下,代码如下. //数组交集 Array.protot ...

  2. 火狐hr标签的兼容性问题

    想在盒子里加一条白色横线 加了以下代码 页面效果如下<hr style="width:80%;height:1px;border:none;border-top:1px solid # ...

  3. js之面向对象

    本文的面向对象分为ES6和ES6之前的,重点学习ES6的===============================一.面向对象 1.什么是面向对象 a)什么是对象:万物都可以抽象成对象 时间对象 ...

  4. HTTP协议学习随笔

    一 HTTP概述 HTTP简单说其实就是一套语言交流规则!Http使用的是可靠的数据传输协议,因此即使数据来自地球的另一端,也能够确保数据在传输过程中不会被损坏或产生混乱. B/S结构 用户在浏览器, ...

  5. 葡萄城报表 SP2 新特性(1)— 单元格智能合并

    中国式复杂报表的布局,因为数据的动态性和结构性,导致其布局往往是无规律,且在设计时无法预测的,如单元格合并,通常不仅希望在每一列的数据展现中,能够根据需要自动将相同的单元格合并,且每个单元格之间该属性 ...

  6. Python 基于python实现的http接口自动化测试框架(含源码)

    基于python实现的http+json协议接口自动化测试框架(含源码) by:授客 QQ:1033553122      欢迎加入软件性能测试交流 QQ群:7156436  由于篇幅问题,采用百度网 ...

  7. iOS 开发之环形倒计时进度条(虚线/实线)

    代码很简单,一看便知.这里为顺时针,若想要逆时针,clockwise改为0,还需更改起始角度和终点角度. 源码地址:https://github.com/LfyDragon/CountDown 直接上 ...

  8. 8086CPU的出栈(pop)和入栈(push) 都是以字为单位进行的

    8086CPU的出栈(pop)和入栈(push) 都是以字为单位进行的

  9. crontab 命令使用

    什么是crontab? crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令.该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行. ...

  10. October 28th, 2017 Week 43rd Saturday

    All I ever wanted was a single thing worth fighting for. 我想要的只不过是一件能让我奋不顾身的事业. Stop complaining the ...