僵尸进程与孤儿进程

...........

守护进程

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. rest framework之渲染器

    一.内置渲染器 REST框架包括许多内置的Renderer类,它们允许你使用各种媒体类型返回响应.还支持定义你自己的自定义渲染器. 内置渲染器的使用 1.全局设置 可以使用DEFAULT_RENDER ...

  2. SQL的判断重复新增或者修改

    <insert id="insertTankStatisticData" parameterType="java.util.Map"> <se ...

  3. leetcood学习笔记-7

    Python join()方法 join()方法语法: str.join(sequence) 参数 sequence -- 要连接的元素序列. 返回值 返回通过指定字符连接序列中元素后生成的新字符串. ...

  4. php随机生成数字加字母的字符串

    function getRandomString($len, $chars=null) { if (is_null($chars)) { $chars = "ABCDEFGHIJKLMNOP ...

  5. go new

    go new 尽管没有构造函数,go有一个内置的函数new,可以用来分配一个类型需要的内存.new(X)和&X{}是等效的: goku := new(Saiyan) // 等效 goku := ...

  6. linux IPC socket

    套接字是通讯端点的抽象 创建一个套接字 #include <sys/types.h> #include <sys/socket.h> int socket(int domain ...

  7. Linux服务器的16个监控命令

    想不想知道你的服务器到底在干什么?那么你要知道本文介绍的这些基本命令.一旦你熟悉掌握了这些命令,就为成为专业的 Linux系统管理员打下了基础. 你可以通过图形化用户界面(GUI)程序来获取这些外壳命 ...

  8. Dubbo 如何成为连接异构微服务体系的最佳服务开发框架

    从编程开发的角度来说,Apache Dubbo (以下简称 Dubbo)首先是一款 RPC 服务框架,它最大的优势在于提供了面向接口代理的服务编程模型,对开发者屏蔽了底层的远程通信细节.同时 Dubb ...

  9. NX二次开发-BlockUI的Tree树控件

    关于BlockUI的Tree树控件只要研究UGOPEN里西门子官方的那个例子在结合去查NXOPEN的帮助基本就可以了.[不过我是看唐工的视频学会的,没办法自己领悟性不太强] //=========== ...

  10. 画山 paint

    画山 paint 有一张大小为n*m的白纸,小R想在纸上画一片绵延的群山. 为了描述方便,我们将纸张表示在坐标系上,四个顶点的坐标分别为(0,0),(n,0),(0,m),(n,m). 小R有一只神奇 ...