Ethon

为什么要有方法,因为懒惰是一种美德。

   :: 首页  :: 新随笔  ::  ::  :: 管理

进程的概念

  • 进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。
  • 进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时(操作系统执行之),它才能成为一个活动的实体,我们称其为进程。
  • 进程是操作系统中最基本、重要的概念。是多道程序系统出现后,为了刻画系统内部出现的动态情况,描述系统内部各道程序的活动规律引进的一个概念,所有多道程序设计操作系统都建立在进程的基础上。

进程和线程的对比:

  • 进程是资源分配的基本单位,线程是CPU调度的基本单位;
  • 进程运行需要独立的内存资源,线程需要的是必不可少的一点资源;
  • 进程切换慢,线程切换快;
  • 线程不能独立运行,必须运行在进程中(进程能提供资源);
  • CPU密集型,进程优先,IO密集型使用线程;

python中进程的操作

process模块是一个创建进程的模块,借助这个模块,就可以完成进程的创建。

1进程的使用

import multiprocessing
import time


def work1():
    for i in range(10):
        print("正在运行work1.....", i, "子进程编号:", multiprocessing.current_process().pid)
        time.sleep(0.5)


if __name__ == '__main__':
    process_obj = multiprocessing.Process(target=work1, name="p1")
    print("主进程编号:", multiprocessing.current_process().pid)
    process_obj.start()

2)进程参数的传递

import multiprocessing
import time


def work1(a, b, c):
    print("参数:", a, b, c)
    for i in range(10):
        print("正在运行work1....")
        time.sleep(0.5)


if __name__ == '__main__':
    # 1.args传递元祖
    # process_obj = multiprocessing.Process(target=work1, args=(1, 2, 3))
    # 2.kwargs传递字典
    # process_obj = multiprocessing.Process(target=work1, kwargs={"a": 1, "b": 2, "c": 3})
    # 3.args与kwargs混合传递
    process_obj = multiprocessing.Process(target=work1, args=(1,), kwargs={"c": 3, "b": 2})
    process_obj.start()

3)进程间全局变量不能共享

import multiprocessing
import time

g_num = 0


def work1():
    global g_num
    for i in range(10):
        g_num += 1

    print("work1.....", g_num)    # 10


def work2():
    print("work2.....", g_num)    # 0


if __name__ == '__main__':
    p1 = multiprocessing.Process(target=work1)
    p2 = multiprocessing.Process(target=work2)
    p1.start()
    p2.start()
    time.sleep(2)
    print("主进程....", g_num)   # 0

4)进程的守护

import multiprocessing
import time


def work():
    for i in range(10):
        print("子进程运行中....", i)
        time.sleep(0.5)


if __name__ == '__main__':
    p = multiprocessing.Process(target=work)
    # 进程守护:子进程与主进程的一种约束,当主进程结束时,子进程也随之结束。
    p.daemon = True
    p.start()
    time.sleep(2)
    exit()
    print("xxxxxx")

 

二、进程池

进程池:是一个进程的容器,可以自动帮我们创建指定数量的进程,并管理进程及工作。

import multiprocessing
import time


def copy_file():
    print("正在copy文件....", multiprocessing.current_process())
    time.sleep(0.5)


if __name__ == '__main__':
    # 创建线程池
    pool = multiprocessing.Pool(3)
    for i in range(10):
        # 以进程池同步的方式copy文件
        # pool.apply(copy_file)

        # 如果以进程池异步的方式copy文件,需做两步操作
        # 1) pool.close() 表示不再接收新的任务
        # 2)主进程不在等待进程池执行结束后再退出,需要进程池join()
        pool.apply_async(copy_file)
        
    pool.close()
    pool.join()

 

posted on 2020-07-07 08:57  Ethon  阅读(173)  评论(0编辑  收藏  举报