僵尸进程与孤儿进程

...........

守护进程

from Multiprocessing  import Process

在 suboprocess.start( ) 的上一行,增加 subprocess.deamon( ),创建守护进程。当主进程执行完成时,subprocess也会被强制结束。

进程之间是相互独立的,主子两个进程在执行时,数据是隔离的。

进程、线程互斥锁

from Multiprocessing import Lock

from threading import Lock

lock = Lock( )

lock.acquire( )  #加锁

lock.release( )  #释放锁

进程互斥锁是为了保证数据的读写安全。避免并发造成数据的错乱。

队列

队列可以使得进程之间的数据可以交互。

队列遵循先进先出(FIFO)的原则.

python中可以使用队列的三种方法

from multiprocessing import Queue
from multiprocessing import JoinableQueue # 基于Queue封装的
import queue # 内置的队列 q_obj = Queue(count) # 对应 import Queue,规定队列中能存放几个值,count为数量
q_obj = JoinableQueue(count) # 对应 import JoinableQueue
q_obj = queue.Queue(count) # 对应 import queue,以上三种方式,三选一。 q_obj.put_nowait(args) # 给队列中增加值,如果队列中满了,就会报错
q_obj.put(args) # 给队列中增加值, 如果队列满了,就会阻塞等待 q_obj.get_nowait() # 从队列中取值,如果取不到值,就会报错。
q_obj.get() # 从队列中取值,如果取不到,就会阻塞等待

  

IPC机制    Interprocess conmunication 进程间通信,在产生子进程时,将队列作为参数传入

生产者和消费者模型    基于队列,在producer 和consumer之间交互信息。

线程

进程是资源单位,开启一个进程,会自动开启一个主线程。

线程是执行单位,开启一个进程会。

IO密集型的程序,做成多线程,计算密集型的程序,做成多进程。

守护线程

主线程要盯着非守护线程结束,主线程才结束,线程上加了 deamon的就是守护线程

守护线程盯着主线程,主线程结束,守护线程立即陪葬。

线程池和进程池

from  concurrent.futures import  ThreadPoolExecutor(多线程)      ProcessPoolExecutor(多进程)

pool = ThreadPoolExecutor(数量)、ProcessPoolExecutor(数量)

pool.submit( 函数方法名,参数  )

pool.shutdown( wait = True )   暂停往池子里加东西

异步调用与回调机制

同步调用

取值用    .result()

# _*_ coding: gbk _*_
# @Author: Wonder from concurrent.futures import ThreadPoolExecutor
from threading import current_thread
import os def task1(num):
print('%s start calculation PID: %s' % (current_thread().getName(), os.getpid()))
res = num ** 2
return res def task2(a):
print(a) if __name__ == '__main__':
pool = ThreadPoolExecutor(5)
for i in range(50):
res = pool.submit(task1, i).result() # pool.submit(task1, i)对象的返回值,使用result()
print(res)
pool.shutdown(wait=True)

  

异步调用

# _*_ coding: gbk _*_
# @Author: Wonder from concurrent.futures import ThreadPoolExecutor
from threading import current_thread
import os def task1(num):
print('线程:%s开始计算,其进程PID: %s' % (current_thread().getName(), os.getpid()))
res = num ** 2
return res def task2(a):
print(a) # <Future at 0x2587d4e28c8 state=finished returned int> 是一个对象
a = a.result() # 对象取值,用result()
print('平方结果为:%s' % a) if __name__ == '__main__':
pool = ThreadPoolExecutor(5)
for i in range(50):
pool.submit(task1, i).add_done_callback(task2) # add_done_callback()回调函数,执行task2
pool.shutdown(wait=True)

a.result( ) # 对象取值 

pool.submit(task1, i).add_done_callback(task2) --------->回调函数,执行完task1 后,自动去执行task2

CSIC_716_20191207【并发编程---进程与线程】的更多相关文章

  1. Java并发编程:进程和线程的由来(转)

    Java多线程基础:进程和线程之由来 在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编程.当然,Java并发编程涉及到很多方面的内容,不是一朝一夕就能够融会贯通 ...

  2. (并发编程)进程池线程池--提交任务2种方式+(异步回调)、协程--yield关键字 greenlet ,gevent模块

    一:进程池与线程池(同步,异步+回调函数)先造个池子,然后放任务为什么要用“池”:池子使用来限制并发的任务数目,限制我们的计算机在一个自己可承受的范围内去并发地执行任务池子内什么时候装进程:并发的任务 ...

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

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

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

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

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

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

  6. Java并发编程系列-(2) 线程的并发工具类

    2.线程的并发工具类 2.1 Fork-Join JDK 7中引入了fork-join框架,专门来解决计算密集型的任务.可以将一个大任务,拆分成若干个小任务,如下图所示: Fork-Join框架利用了 ...

  7. python系列之 - 并发编程(进程池,线程池,协程)

    需要注意一下不能无限的开进程,不能无限的开线程最常用的就是开进程池,开线程池.其中回调函数非常重要回调函数其实可以作为一种编程思想,谁好了谁就去掉 只要你用并发,就会有锁的问题,但是你不能一直去自己加 ...

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

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

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

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

随机推荐

  1. 【Luogu】【关卡2-4】排序Ex(2017年10月)

    任务说明:这里的排序就更上一层了.不仅融合了别的算法与技巧,排序本身也有各种花招.

  2. 对AngularJs的简单了解

    一.简单介绍 AngularJS是为了克服HTML在构建应用上的不足而设计的.HTML是一门很好的为静态文本展示设计的声明式语言,但要构建WEB应用的话它就显得乏力了.所以我做了一些工作(你也可以觉得 ...

  3. obj.offsetHeight与obj.style.height $(obj).height()与$(obj).css('height')

    相同:都可以获取obj的高度区别:(1)obj.offsetHeight可以获取外部.内嵌和内联中定义的高,而obj.style.height只能获取内联中定义的高:(2)obj.offsetHeig ...

  4. Anaconda配置

    0x00 下载 为了更快的下载,可以到清华开源软件镜像站下载 地址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ 在此以Anaconda ...

  5. 【Java架构:基础技术】一篇文章搞掂:Spring Tool Suite(STS)

    1.简介 STS,是一个自定义版本的Eclipse,她可以方便地用来与各种Spring项目进行交互协作,建议采用Spring进行开发的时候,可以尝试使用这个IDE 2.下载与安装 登录https:// ...

  6. phpstrom中Terminal窗口打开

    Terminal窗口其实就是cmd窗口

  7. 基于Netty的RPC架构学习笔记(十二):借助spring实现业务分离、聊天室小项目、netty3和4、5的不同、业务线程池以及消息串行化

    文章目录 借助spring实现业务分离(

  8. JS基础复习

      js基础语法     Netcape        js基础语法规范(ECMAScript1,2,3,3.1,5(IE9),6   ES    ES6=es2015) DOM BOM       ...

  9. SPOJ VFMUL - Very Fast Multiplication (FFT)

    题目链接:VFMUL - Very Fast Multiplication Description Multiply the given numbers. Input n [the number of ...

  10. Ubuntu12.04下安装sourcenavigator-NG4.5阅读源代码

    大家知道Windows下有一个很好的查看源代码的软件sourceinsight,使用sourceinsight查看Linux内核代码.嵌入式软件开发中的C语言项目源代码.驱动程序代码很是方便.在Lin ...