python基础(进程的创建,守护进程)

一、进程的创建与方法:

  1.1 进程之间的相互关系:

主进程和子进程互不干扰
主进程的代码结束,守护进程结束
主进程要回收守护进程(子进程)的资源
主进程等待其他所有子进程结束
主进程回收所有子进程的资源

  1.2 创建同步进程:

  
# 进程同步:
import os
import time


def func(i):
    time.sleep(5)
    print(i, os.getpid())


print('主 :', os.getpid())  # 获取进程号
func(0)  # 每次执行完以后再执行下一个程序
func(1)
func(2)
View Code

  1.3  创建异步进程:

  
# 进程异步

import time
from multiprocessing import Process

def func(i):
    time.sleep(5)
    print(i, os.getpid())

if __name__ == '__main__':
    Process(target=func).start()  # 异步:异步非阻塞
    Process(target=func).start()
    Process(target=func).start()


# linux和mac中不需要加if __name__ == '__main__':,创建一个子进程是通过文件拷贝
# windows中python创基子进程是通过import方法创建一个子进程
View Code

  1.4 进程的其他方法:

  
# 3.进程中的其他几个方法

import os
import time
from multiprocessing import Process


def func(a, b, c):
    time.sleep(1)
    print(a, b, c, os.getpid(), os.getppid())  # 获取进程号和父进程号


# Process进程类
if __name__ == '__main__':
    p = Process(target=func, args=(1, 2, 3))
    p.start()               # p是一个进程操作符
    print(p.is_alive())     # 检测进程是否存活
    p.terminate()           # 异步非阻塞
    print(p.is_alive())
    time.sleep(0.1)
    print(p.is_alive())
    print(p.name)           # 获取进程名
    print(p.pid)            # 获取进程号(同:os.getpid())
View Code

  1.5 一次性创建多个进程:

  
# 如何开启多个子进程

import os
import time
from multiprocessing import Process


def func(a, b, c):
    time.sleep(1)
    print(a, b, c, os.getpid(), os.getppid())


if __name__ == '__main__':
    for i in range(1, 4):
        Process(target=func, args=(i, i + 1, i + 2)).start()  # 创建3个子进程(args参数传递必须是一个元组)
View Code

二、 阻塞等待进程结束(join):

  join:等待程序执行完成,最后实现某些print操作等。

  
# 阻塞等待一个子进程结束

import time
import random
from multiprocessing import Process


def send_mail(name):
    time.sleep(random.uniform(1, 3))
    print('已经给%s发送邮件完毕' % name)


if __name__ == '__main__':
    p = Process(target=send_mail, args=('alex',))
    p.start()
    p.join()  # 阻塞,直到p对应的进程结束之后才结束阻塞
    print('信息发送完毕了')
阻塞等待一个子进程结束
  
# 阻塞等待多个子进程结束:

import time
import random
from multiprocessing import Process


def send_mail(name):
    time.sleep(random.uniform(1, 3))
    print('已经给%s发送邮件完毕' % name)


if __name__ == '__main__':
    lst = ['alex', 'yuan', '宝元', '太白']
    p_l = []
    for name in lst:   # 创建子进程
        p = Process(target=send_mail, args=(name,))
        p.start()
        p_l.append(p)
    for p in p_l:  # 阻塞等待全部子进程执行完成
        p.join()
    print('所有的信息都发送完毕了')
阻塞等待多个子进程结束

三、守护进程(daemon):

  3.1 定义:

是一个子进程,守护的是主进程
结束条件 : 主进程的代码结束,守护进程也结束

  
# 示例:

import time
from multiprocessing import Process


def func():   # 子进程1
    for i in range(20):
        time.sleep(0.5)
        print('in func')


def func2():  # 子进程2
    print('start : func2')
    time.sleep(5)
    print('end : func2')


if __name__ == '__main__':
    p = Process(target=func)
    p.daemon = True  # 表示设置p为一个守护进程
    p.start()
    p2 = Process(target=func2)
    p2.start()  # 开启子进程p2
    print('in main')
    time.sleep(3)
    print('finished')
    p2.join()  # 守护进程最后主进程代码结束后结束
View Code

四、面向对象的方式实现多进程:

  
# 示例(无参数)
import os
from multiprocessing import Process


class MyProcess(Process):
    def run(self):  # 子进程
        print(os.getpid())  # 查看进程号


if __name__ == '__main__':
    for i in range(10):
        MyProcess().start()  # 通知操作系统开进程,执行run方法
无参数实现
  
# 示例(带参数)
import os
from multiprocessing import Process


class MyProcess(Process):
    def __init__(self, a, b):
        super().__init__()  # 继承Process中的init方法
        self.a = a   # 属性
        self.b = b

    def run(self):  # 子进程中执行的代码就放在run方法中
        print(os.getpid(), self.a, self.b)


if __name__ == '__main__':
    for i in range(10):
        MyProcess(1, 2).start()  # 通知操作系统开进程,执行run方法
带参数实现

五、内置的文件中的变量(__file__,__name__,__all__):

  
# __file__:
# 查看当前文件的绝对路径
print(__file__)  # C:/Users/Administrator/Desktop/json/OLDBOY_20/20190415day032/理解__name__.py
__file__
  
# __all__:
# 模块和包中定义了__all__ = [a, b]的规则
import re
print(re.__all__)   # ['match', 'fullmatch', 'search'...]这里打印的是所有规则的方法与属性
__all__
  
# __name__:
# 1.右键直接运行执行:__name__ == '__main__',显示当前模块的名字
# 2.导入这个模块执行,__name__ == '模块名'

# 示例1:
# 写的所有的代码是不希望这个文件作为模块被导入的时候执行的代码
if __name__ == '__main__':
    func()  # 模块导入不执行

# 示例2:
import sys
print(sys.modules[__name__])  # 当前文件时:__name__ == '__name__'
__name__

 

摘要:https://www.cnblogs.com/16795079a/p/10445054.html

 

posted @ 2019-04-15 16:10  Amorphous  阅读(546)  评论(0编辑  收藏  举报