引子

  进程

  线程(优先阅读)

  协程

进程

概念:就是一个程序在一个数据集上的一次动态执行过程(本质上来讲,就是运行中的程序(代指运行过程),程序不运行就不是进程)    抽象概念

组成:

   1、程序:我们编写的程序用来描述进程要完成哪些功能以及如何完成

   2、数据集:数据集则是程序在执行过程中所需要使用的资源

   3、进程控制块:进程控制块用来记录进程的外部特征,描述进程的执行变化过程,系统可以利用它来控制和管理进程,它是系统感知进程存在的唯一标志。

阐释:进程与进程之间都占用的是独立的内存块,它们彼此之间的数据也是独立的

优点:同时利用多个CPU,能够同时进行多个操作

缺点:耗费资源(需要重新开辟内存空间)

构造方法:

Process([group [, target [, name [, args [, kwargs]]]]])

  group: 线程组,目前还没有实现,库引用中提示必须是None; 
  target: 要执行的方法; 
  name: 进程名; 
  args/kwargs: 要传入方法的参数。

实例方法:

  is_alive():返回进程是否在运行。

  join([timeout]):阻塞当前上下文环境的进程程,直到调用此方法的进程终止或到达指定的timeout(可选参数)。

  start():进程准备就绪,等待CPU调度

  run():strat()调用run方法,如果实例进程时未制定传入target,这star执行t默认run()方法。

  terminate():不管任务是否完成,立即停止工作进程

属性:

  daemon:和线程的setDeamon功能一样

  name:进程名字。

  pid:进程号。

创建进程的方式有俩种

一,通过调用模块的方式来创建线程

# 进程模块
import multiprocessing
import time

def f1():
    start = time.time()
    sum = 0
    for n in range(100000000):
        sum += n
    print(sum)
    print("data:{}".format(time.time() - start))
if __name__ == '__main__':   # windows在调用进程的时候,必须加这句话,否则会报错
    li = []
    p1 = multiprocessing.Process(target=f1)
    li.append(p1)
    p2 = multiprocessing.Process(target=f1)
    li.append(p2)
    for p in li:
        p.start()
    for i in li:
        i.join()

    print("ending...")

二,通过继承类的方式(推荐)

import multiprocessing


class Process(multiprocessing.Process):
    def run(self):
        sum = 0
        for n in range(100000000):
            sum += n
        print(sum)

li = []
for i in range(2):
    p = Process()
    li.append(p)

if __name__ == '__main__':
    for p in li:
        p.start()

    for i in li:
        i.join()

    print("ending")

进程之间的通信

创建进程模块的下队列(Queue)

# 进程之间的通信   Queue
from multiprocessing import Queue, Process, Pipe
import os,time,random


def write(q):
    print("process to write{}".format(os.getpid()))
    for value in ["A","B","C"]:
        print("Put {} to queue...".format(value))
        q.put(value)
        time.sleep(random.random())


def read(q):
    print("process to read{}".format(os.getpid()))
    while True:
        value = q.get(True)
        print("Get {} from queue".format(value))

if __name__ == '__main__':
    q = Queue()
    pw = Process(target=write,args=(q,))  # 这里传输的q是copy的
    pr = Process(target=read,args=(q,))
    pw.start()
    pr.start()

    pw.join()
    pr.terminate()  # 强行终止进程(因为这个子进程定义了一个死循环)
进程队列(Queue)

相关文章:

  • 2022-12-23
  • 2021-08-07
  • 2021-09-30
  • 2021-12-10
  • 2022-12-23
  • 2021-12-08
  • 2022-12-23
猜你喜欢
  • 2021-07-07
  • 2021-12-24
  • 2021-06-19
  • 2021-07-26
  • 2021-12-25
  • 2021-11-06
  • 2022-12-23
相关资源
相似解决方案