进程介绍

  • 什么是进程
  • 程序:例如pychram、QQ都是程序
  • 进程:一个程序运行起来后,代码+用到的资源 称之为进程,它是操作系统分配资源的基本单元
  • 不仅可以通过线程完成多任务,进程也是可以的
  • 进程的状态
  • 工作中,任务数往往大于cpu的核数,即一定有一些任务正在执行,而另外一些任务在等待cpu进行执行,因此导致了有了不同的状态
  • 就绪状态:运行的条件都已经满足了,随时可以给操作系统调度执行
  • 执行状态:cpu正在执行其功能
  • 等待状态:等待某些条件满足,例如一个程序sleep了,此时就处于等待态

python进程被无故kill python 进程状态_子进程

进程、线程对比

  • 功能
  • 进程,能够完成多任务,比如 在一台电脑上能够同时运行多个软件
  • 线程,能够完成多任务,比如 一个QQ中的多个聊天窗口
  • 定义不同
  • 一个进程中可以包含若干个线程,它们可以利用进程所拥有的资源,在操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位,由于线程比进程更小,基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),故对它的调度所付出的开销就会小得多,能更高效的提高系统内多个程序间并发执行的程度

 

import os

"""
创建进程的参数:
    target:指定进程执行的任务函数
    name:设置进程名称
    args:给任务函数传递参数(元组)
    kwargs:给任务函数传递参数(字典)
    daemon:是否设为守护进程
        守护进程:主进程执行结束、子进程不管有没有执行完,都终止执行


进程对象的方法:
    start():启动进程
    join():设置主进程等待子进程执行的时间(默认等待执行完)


注意点:进程之间数据的独立的(不共享)

multiprocessing:

"""
from multiprocessing import Process

import time


def func1(name):
    print('func1执行的进程ID{},父进程的ID:{}'.format(os.getpid(),os.getppid()))
    for i in range(5):
        print("{}------正在做事情1------".format(name))

        time.sleep(1)


def func2(name):
    print('func2执行的进程ID{},父进程的ID:{}'.format(os.getpid(),os.getppid()))
    for i in range(6):
        print("{}-----正在做事情2------".format(name))
        time.sleep(1)


# # 创建进程
# p1 = Process(target=func1, args=('z1',))
# p2 = Process(target=func2, kwargs={'name': "z2"})
# # 启动进程
# p1.start()
# p2.start()

def run():
    p1 = Process(target=func1, args=('z1',))
    p2 = Process(target=func2, kwargs={'name': "z2"})
    # 启动进程
    p1.start()
    p2.start()


if __name__ == '__main__':
    # 创建进程
    print('主进程的进程ID',os.getpid())
    run()

进程间通信

Python multiprocessing.Queue() 和 queue.Queue区别

  • Queue.Queue是进程内队列,同一个进行中多个线程之间通信用。
  • multiprocess.Queue是跨进程通信队列。

进程中Queue的使用

  • 可以使用multiprocessing模块的Queue实现多进程之间的数据传递,Queue本身是一个消息列队程序,首先用一个小实例来演示一下Queue的工作原理:在父进程中创建两个子进程,一个往Queue里写数据,一个从Queue里读数据:
  • 注意点进程之间的queue要当做参数传进去(不共享全局变量)

注意点:进程中任务的参数和返回必须是一个可序列化的对象 pickle.dumps

import pickle
import unittest

a = unittest.TestResult()
res = pickle.dumps(a)
print(res)

 PS:JoinableQueue(),进程中的队列模块,继承了进程中的Queue,拥有普通队列的taskdone()和join()方法