美文网首页
python学习笔记-多任务

python学习笔记-多任务

作者: MR_詹 | 来源:发表于2020-09-24 22:12 被阅读0次

进程

主进程会等待子进程执行完成以后程序在退出

解决办法:主进程退出子进程销毁
1、让子进程设置成为守护主进程,主进程退出子进程销毁,子进程会依赖主进程

sub_process.daemon = True

2、让主进程退出之前先让子进程销毁

sub_process.terminate()

并行:
并发:在一段时间内交替去执行任务

任务数大于cpu的核数表示并发的去执行多任务
任务数小于等于cpu的核数表示并行的去执行多任务

进程是操作系统进行资源分配的基本单元
进程是Python程序中实现多任务的一种方式

#导入进程包
import multiprocessing

#创建进程
格式
Process([group [,traget[,name[,args[,kwargs]]]]])
* group : 指定进程组,目前只能使用None
* �target:执行的目标任务名(函数)
* name: 进程名称(默认为Process-N ,N 为从1开始递增的整数)
* args: 以元组方式给执行任务传参
* kwargs:以字典方式给执行任务传参

# Process常用实例方法
* start():  启动子进程实例
* join(): 等待子进程执行结束
* terminate: 不管任务是否完成,立即终止子进程

import os

获取当前进程编号
os.getpid()

获取当前父进程编号
os.getppid()

强制杀死进程(根据进程编号)
os.kill(进程编号,9)

获取当前进程对象
multiprocessing.current_process()
进程执行带参数的任务
def show_info(name,age):
    print(name,age)

/// 以元组的方式传参
/// 元组里面的元素顺序和函数的参数顺序要保持一致
sub_process = multiprocessing.Process(target=show_info(),args=('李四',20))
sub_process.start()

/// 以字典的方式传参
/// 字典里面的key,要和函数里面的参数名保持一致,没有顺序要求
sub_process = multiprocessing.Process(target=show_info(),kwargs={'age':20,'name':'李四'})
sub_process.start()

线程

#导入线程模块
import threading

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

/// 启动线程
使用start方法


例如:
import threading
import time

def print_num():
    # 获取当前线程
    current_thread = threading.current_thread()
    print('sing:',current_thread)
    for i in range(10):
        print(i)
        time.sleep(0.2)

if __name__ == '__main__':
    main_thread = threading.current_thread()
    print('mainThread:',main_thread)
    print_thread = threading.Thread(target=print_num)
    print_thread.start( )

* 线程之间执行是无序的
* 主线程会等待所有子线程执行完成才结束
  /// threading.Thread(target=print_num,daemon=True)
  /// daemon=True,表示创建的子线程守护主线程
  /// 子线程守护主线程:表示主线程退出子线程直接销毁
* 线程之间共享全局变量
* 线程之间共享全局变量数据出现错误问题
  ///  解决办法:线程同步
  /// 1、线程等待(join)
  /// 2、互斥锁(对共享数据进行锁定,保证同一时刻只能有一个线程去操作 )
  /// 互斥锁是多个线程一起去抢,抢到锁的线程先执行,没有抢到锁的线程需要等待,
  /// 等互斥锁使用完释放后,其他等待的线程再去抢这个锁
互斥锁的使用

# 创建锁
mutex = threading.Lock()

# 上锁
mutex.acquire()

...这里编写代码能保证同一时刻只能有一个线程去操作,对共享数据进行锁定

# 释放锁
mutex.release()

区别

* 线程是依附在进程里面的,没有进程就没有线程
* 一个进程默认提供一个线程,进程可以创建多个线程

1、进程之间不共享全局变量
2、线程之间共享全局变量
3、创建进程的资源开销要比创建线程的资源开销要大
4、进程是操作系统分配资源的基本单位,线程是CUP调度的基本单位
5、线程不能独立执行,必须依存在进程中
6、多进程开发比单进程多线程开发稳定性要强


和计算密集型的操作使用多进程

相关文章

网友评论

      本文标题:python学习笔记-多任务

      本文链接:https://www.haomeiwen.com/subject/vfkayktx.html