35 并行/发 同/异步 非/ 阻塞 进程的两种开启方式, 进程的常用方法及属性

主要内容:

1  名词解释

并行 :  即两件事情或多件事情,在同一时间点同时执行.是从微观上,也就是在一个精确的时间片刻,有不同的程序在执行,这就要求必须有多个处理器

并发 :  即两件事情或多件事情在同一时间段交替进行. 是从宏观上,在一个时间段上可以看出是同时执行的,比如一个服务器同时处理多个session。

同步 :  所谓同步就是一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成,这是一种可靠的任务序列。要么成功都成功,失败都失败,两个任务的状态可以保持一致。

异步 : 所谓异步是不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,依赖的任务也立即执行,只要自己完成了整个任务就算完成了。至于被依赖的任务最终是否真正完成,依赖它的任务无法确定, 所以它是不可靠的任务序列.

阻塞 :

非阻塞 :

2 . 开启进程两种方式

  1) 第一种

from multiprocessing import Process
import os
import time
def func(i):
    time.sleep(0.2)
    print(‘这是子进程%s,pid为%s ,其父进程的pid为%s‘ % (i, os.getpid(), os.getppid()))
# os.getpid(), 获得当前进程的pid,
# os.getppid(),获得当前进程的父进程的pid
if __name__ == ‘__main__‘:
    for i in range(2):
        p = Process(target=func, args=(i,))   #实例化一个进程对象
        #target:子进程要执行的任务,args:父进程要给子进程传递的参数,必须是元祖形式.
        p.start()                            #开启一个进程.
        time.sleep(0.2)
    print(‘这是父进程, pid为%s, 其父进程的pid为%s‘ % (os.getpid(), os.getppid()))

  2) 继承

from multiprocessing import Process
import time
import os
class Myprocess(Process):
    def __init__(self):
        super(Myprocess, self).__init__()
    def run(self):
        print(‘在类中创建子进程‘)
if __name__ == ‘__main__‘:
    p = Myprocess()
    p.start()       #是指解释器告诉操作系统, 去帮我开启一个进程, 就绪状态
    p.run()         # 解释器告诉操作系统,马上帮我执行这个过程.   执行状态

    带名字的

from multiprocessing import Process
import time
import os
class Myprocess(Process):
    def __init__(self, name):
        self.name = name
        super(Myprocess, self).__init__(name = name)   # 如果不写在执行父类中的__init是name会被覆盖.
    def run(self):
        print(‘这是以类的方式开启的子进程, 名字为%s‘ % self.name)
if __name__ == ‘__main__‘:
    p = Myprocess(‘alex‘)
    p.start()       #是指解释器告诉操作系统, 去帮我开启一个进程, 就绪状态.
    # p.run()       # 解释器告诉操作系统立即去开启一个进程, 执行状态.

3 . 进程的常用方法:

  1) start 和join

    join : 是让主进程等待子进程执行完再执行

from multiprocessing import Process
import os
import time
def func():
    for i in range(100):
        time.sleep(0.1)
        print(‘这是子进程‘)
if __name__ == ‘__main__‘:
    p = Process(target=func)   #子进程要执行的任务
    p.start()
    # p.join()                   #是让主进程等待子进程执行完, 现象 : 主进程走到这句话, 主进程阻塞住, 等待子进程执行完.
    for i in range(100):
        time.sleep(0.1)
        print(‘这是父进程‘)
# 开启一个正常的子进程,父进程会等待子进程结束后,父进程也就是程序才结束
# p.join()# 是让主进程等待子进程执行完。  现象:主进程执行到这句话,主进程阻塞住,等待子进程执行
# 如何把父进程和子进程之间的关系变为同步或者异步?
# 父进程执行join,就会变成同步,不执行join,父进程和子进程就是异步的关系
# join必须放在start()后边

  2) is_alive 和terminate

def func():
    time.sleep(1)
if __name__ == ‘__main__‘:
    p = Process(target=func,)
    p.start()
    p.terminate()# 杀死p进程,让解释器告诉操作系统,请杀掉p进程。
    print(‘子进程是否还活着?‘, p.is_alive())
    time.sleep(0.002)
    print(‘子进程是否还活着?‘, p.is_alive())
    # 返回一个bool值,如果返回True,代表进程还活着,如果返回False,代表子进程死了
# p.is_alive() 判断p进程是否还活着
# p.terminate() 杀死p进程

4 . 进程的常用属性:

  1)  name 和 pid

from multiprocessing import Process
import time
import os
def func():
    print(‘这是子进程, pid为%s‘ % os.getpid())
if __name__ == ‘__main__‘:
    p = Process(target=func)
    p.start()
    p.name = ‘alex‘
    print(‘可以查看子进程的pid‘,p.pid)
    print(‘可以查看子进程的名字‘, p.name)
    print(‘子进程是不是守护进程‘, p.daemon)   false

  2 ) 守护进程

    特点 : 将进程设置为守护进程 , 必须在start之前 daemon = false

       守护进程会随着主进程的结束而结束

       守护进程不能有子进程.

    **守护进程会随着主进程的结束而结束

from multiprocessing import Process
import time
def func():
    time.sleep(3.1)
    print(‘this is son process‘)
if __name__ == ‘__main__‘:
    p = Process(target=func)
    p.daemon = True       #必须在start之前设置
    p.start()
    time.sleep(3)
    print(‘this is parent process‘)
#守护进程会随着主进程的结束而结束.

       **守护进程不能有子进程

from multiprocessing import Process
import time
def func1():
    print(‘这里是孙子‘)
def func():
    p = Process(target=func1)
    p.start()
    time.sleep(5)
    print(‘这里是儿子哦‘)
if __name__ == ‘__main__‘:
    p = Process(target=func)
    p.daemon = True # 将p进程设置为守护进程,必须要在start之前设置
    p.start()
    time.sleep(1)
    print(‘这是爸爸‘)
# 守护进程:不允许开启子进程

  

  

  

原文地址:https://www.cnblogs.com/gyh412724/p/9507072.html

时间: 2024-11-08 01:18:38

35 并行/发 同/异步 非/ 阻塞 进程的两种开启方式, 进程的常用方法及属性的相关文章

并行,并发,串行,同步,异步,阻塞,非阻塞,同步阻塞,同步非阻塞,异步阻塞,异步非阻塞

并行和并发 并发和并行从宏观上来讲都是同时处理多路请求的概念.但并发和并行又有区别,并行是指两个或者多个事件(多核线程)在同一时刻发生:而并发是指两个或多个事件(进程或者程序)在同一时间间隔内发生.计算机在宏观上并发,微观上并行. 在操作系统中,并发是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行. ①程序与计算不再一一对应,一个程序副本可以有多个计算 ②并发程序之间有相互制约关系,直接制约体现为一个程序需

透过现象看本质——回头再看Nginx(进程模型、异步非阻塞、源码目录结构)

透过现象看本质--回头再看Nginx Nginx的进程模型 ? 使用过nginx的朋友都知道nginx的性能很高,而其原因可能少有人知.首先,nginx的架构就奠定了其高性能的基础.那么就先来看看nginx的基础架构吧,如下图所示:(不能完全理清楚所有内容也没关系,因为本小节讲述的主要内容是Nginx的进程模型) ? 本小节先来说说Nginx基础架构中的进程模型: ? 所谓进程模型,即Nginx响应请求或服务时程序运行(机器执行指令集)的方式,一般在nginx服务启动后,在Unix系统中会以da

爬虫必备—性能相关(异步非阻塞)

在编写爬虫时,性能的消耗主要在IO请求中,当单进程单线程模式下请求URL时必然会引起等待,从而使得请求整体变慢. 1. 同步执行 1 import requests 2 3 def fetch_async(url): 4 response = requests.get(url) 5 return response 6 7 8 url_list = ['http://www.github.com', 'http://www.bing.com'] 9 10 for url in url_list:

转一贴,今天实在写累了,也看累了--【Python异步非阻塞IO多路复用Select/Poll/Epoll使用】

下面这篇,原理理解了, 再结合 这一周来的心得体会,整个框架就差不多了... http://www.haiyun.me/archives/1056.html 有许多封装好的异步非阻塞IO多路复用框架,底层在linux基于最新的epoll实现,为了更好的使用,了解其底层原理还是有必要的.下面记录下分别基于Select/Poll/Epoll的echo server实现.Python Select Server,可监控事件数量有限制: 1 2 3 4 5 6 7 8 9 10 11 12 13 14

异步非阻塞

首先讨论下使用事件驱动,异步编程的优点: 充分利用了系统资源,执行代码无须阻塞等待某种操作完成,有限的资源可以用于其他的任务.其非常适合于后端的网络服务编程. 在服务器开发中,并发的请求处理是个大问题,阻塞式的函数会导致资源浪费和时间延迟.通过事件注册.异步函数,开发人员可以提高资源的利用率,性能也会改善.其nginx和node.js处理并发都是采用的事件驱动异步非阻塞模式.其中nginx中处理并发用的是epoll,poll,queue等方式,node.js使用的是libev,它们对大规模的HT

Tornado异步非阻塞的使用以及原理

Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快.得利于其 非阻塞的方式和对 epoll 的运用,Tornado 每秒可以处理数以千计的连接,这意味着对于实时 Web 服务来说,Tornado 是一个理想的 Web 框架. 一.Tornado的两种模式使用 1.同步阻塞模式 由于doing中sleep10秒,此时其他连接将被阻塞,必须等这次请求完成后其他请求才能连接成功. 1 import tornado.io

nodejs的异步非阻塞IO

简单表述一下:发启向系统IO操作请求,系统使用线程池IO操作,执行完放到事件队列里,node主线程轮询事件队列,读取结果与调用回调.所以说node并非真的单线程,还是使用了线程池的多线程. 上个图看看吧 举一反三:所有的异步非阻塞思路都类似,如:nginx,python的模拟异步非阻塞,还有java的nio.C#的 EAP

node 单线程异步非阻塞

链接:http://www.runoob.com/nodejs/nodejs-callback.html 首先什么是单线程异步非阻塞? 单线程的意思整个程序从头到尾但是运用一个线程,程序是从上往下执行的.异步操作就是程序虽然是从上到下执行的,但是某个函数执行时间过长时并不会阻塞在那里等待它执行完,然后在执行下面的代码.非阻塞也就是这个意思. 为什么node是异步非阻塞的呢,得力于回调函数,还有js中的定时器也是经典的异步操作. ###4.1 Node.js异步机制 由于异步的高效性,node.j

nginx学习(二)——基础概念之异步非阻塞

上面讲了很多关于nginx的进程模型,接下来,我们来看看nginx是如何处理事件的. 有人可能要问了,nginx采用多worker的方式来处理请求,每个worker里面只有一个主线程,那能够处理的并发数很有限啊,多少个worker就能处理多少个并发,何来高并发呢?非也,这就是nginx的高明之处,nginx采用了异步非阻塞的方式来处理请求,也就是说,nginx是可以同时处理成千上万个请求的.想想apache的常用工作方式(apache也有异步非阻塞版本,但因其与自带某些模块冲突,所以不常用),每