多进程与多线程(九)

一、进程的概念

简单来说一个正在运行的程序或者软件就是一个进程,它是操作系统进行资源分配的基本单位,也就是所每启动一个进程,操作系统都会给其分配一定的运行资源(内存资源)保证进程的运行。

ps:一个程序运行后至少产生一个进程,一个进程默认有一个线程,进程里可以创建多个线程,线程是依附在进程里的,没有进程就没有线程。

1、process进程类的说明

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

  •  group:指定进程组,目前只能使用none
  •  target:执行的目标任务
  •  name:进程名字
  •  args:以元组方式传参
  •  kwargs:以字典方式传参

2、process创建的实例对象的常用方法

  •  start():启动子进程实例(创建子进程)
  •  join():等待子进程执行结束
  •  terminate():不管任务是否完成,立即终止子进程

3、process创建的实例对象的常用属性

  • name:当前进程的别名,默认为Process-N,N为从1开始递增的整数

4、基本使用步骤

1、导入进程包
    import multiprocessing
2、创建子进程并指定执行任务
    sub_process = multiprocessing.Process(target=任务名)
3、启动进程执行任务
    sub_process.start()

为了保证子进程能够正常的运行,主进程会等所有的子进程执行结束后再销毁,设置守护进程的目的是主进程退出子进程销毁,不让主进程再等待主进程去执行

        设置守护主进程方式:子进程对象.daemon = True

        销毁子进程方式:子进程对象.terminate()

ps:进程之间不共享全局变量、主进程会等待所有子进程执行结束再结束

 二、线程的概念

线程是进程中执行代码的一个分支,每个执行分支(线程)要想工作执行代码需要CPU进行调度,也就是说线程是CPU调度的基本单位,每个进程至少都有一个线程,而这个线程就是我们通常所说的主线程。

ps:线程共享全局变量,进程不共享全局变量

 线程类Thread参数说明

Thread([group [, target [, name [, args [, kwargs]]]]])
  •  group:线程组,目前只能使用none
  •  target:执行的目标任务名
  •  args:以元组的方式传参
  •  kwargs:以字典的方式传参
  •  name:线程名,一般不用设置

启动线程

        启动线程使用start()方法 

互斥锁

        当多个线程几乎同时修改某一个共享数据的时候,需要进行同步控制。线程同步能够保证多个线程安全访问竞争资源,最简单的同步机制是引入互斥锁。互斥锁为资源引入一个状态:锁定\非锁定。

        某个线程要更改共享数据时,先将其锁定,此时资源的状态为‘锁定’,其他线程不能更改,直到该线程释放资源,将资源的状态变成‘非锁定’,其他的线程才能再次锁定该资源。互斥锁保证了每次只有一个线程进行写入操作,从而保证了多线程情况下数据的正确性。

import threading
#创建锁
mutex = threading.Lock()
#锁定
mutex.acquire()
#释放锁
mutex.release()

锁优缺点:

优点:确保了某段关键代码只能由一个线程从头到尾完整地执行

缺点:阻止了多线程并发执行,包含锁的某段代码实际上只能以单线程模式执行,效率大大降低;由于可以存在多个锁,不同的线程有不同的锁,并试图获取对方持有的锁时,可能会造成死锁。

线程与进程的区别:线程执行开销小,但不利于资源的管理和保护;而进程相反。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值