【博学谷学习记录】超强总结,用心分享|python进阶(2)

目录

多任务

多任务的两种表现形式

1.并发:

2.并行:

进程

python进程的创建

获取进程编号

获取当前进程编号

获取父进程编号

os.kill(进程编号)

进程的注意事项

线程

什么是多线程

线程的创建

线程注意事项


多任务

多任务是指在同一时间内执行多个任务。

例如: 现在电脑安装的操作系统都是多任务操作系统,可以同时运行着多个软件。

多任务的两种表现形式

1.并发:

在一段时间内交替去执行多个任务。

对于单核cpu处理多任务,操作系统轮流让各个任务交替执行,假如:软件1执行0.01秒,切换到软件2,软件2执行0.01秒,再切换到软件3,执行0.01……这样反复执行下去 , 实际上每个软件都是交替执行的 . 但是,由于CPU的执行速度实在是太快了,表面上我们感觉就像这些软件都在同时执行一样 . 这里需要注意单核cpu是并发的执行多任务的。

2.并行:

在一段时间内真正的同时一起执行多个任务。

对于多核cpu处理多任务,操作系统会给cpu的每个内核安排一个执行的任务,多个内核是真正的一起同时执行多个任务。这里需要注意多核cpu是并行的执行多任务,始终有多个任务一起执行。

进程

Python中,想要实现多任务可以使用多进程来完成。

进程(Process资源分配的最小单位它是操作系统进行资源分配和调度运行的基本单位,通俗理解:一个正在运行的程序就是一个进程 . 例如:正在运行的qq , 微信等 他们都是一个进程 .

python进程的创建

1. 导入进程包
             import multiprocessing
2. 通过进程类创建进程对象 
             进程对象 = multiprocessing.Process() 
3. 启动进程执行任务
             进程对象.start()

# 创建子进程
coding_process = multiprocessing.Process(target=coding)
# 创建子进程
music_process = multiprocessing.Process(target=music)
# 启动进程
coding_process.start()
music_process.start()

获取进程编号

当程序中进程的数量越来越多时, 如果没有办法区分主进程和子进程还有不同的子进程, 那么就无法进行有效的进程管理, 为了方便管理实际上每个进程都是有自己编号的。

获取当前进程编号

import os
import multiprocessing

# 方法一:用os模块获取当前进程pid

pid = os.getpid()
print(pid)


# 方法二:用multiprocessing来获取当前进程pid
pid = multiprocessing.current_process().pid
print(pid)

获取父进程编号

import multiprocessing
import os

def work():
    print('执行work任务。。。')
    # 获取当前进程的编号pid
    pid = os.getpid()
    print(f'work子进程编号:{pid}')

    # 获取当前父进程编号ppid
    ppid = os.getppid()
    print(f'当前父进程编号:{ppid}')


if __name__ == '__main__':
    print(f'主进程编号:{os.getpid()}')
    sub_process = multiprocessing.Process(target=work)
    sub_process.start()

os.kill(进程编号)

结束某个进程

进程的注意事项

1.主进程默认不会等所有子进程执行结束后再结束。

#要想让子进程 跟着主进程的结束而结束
#方法一设置守护进程
import multiprocessing
import time

def work(num):
    for i in range(num):
        print('子进程正在执行work')
        time.sleep(0.2)

if __name__ == '__main__':
    work_process = multiprocessing.Process(target=work, args=(10,))
    work_process.daemon = True
    work_process.start()
    time.sleep(1)
    print('主进程执行完毕')

#方法二 直接销毁子进程
import multiprocessing
import time

def work(num):
    for i in range(num):
        print('子进程正在执行work')
        time.sleep(0.2)

if __name__ == '__main__':
    work_process = multiprocessing.Process(target=work, args=(10,))
    # 方法一:设置守护进程
    # work_process.daemon = True
    work_process.start()
    time.sleep(1)
    # 方法二:直接销毁子进程
    work_process.terminate()
    print('主进程执行完毕')

2.进程与进程之间不共享全局变量。实际上,创建一个子进程,就相当于把主进程的资源进行拷贝产生一个新的进程,这里的主进程和子进程是互相独立的。

线程

Python中,想要实现多任务还可以使用多线程来完成。

什么是多线程

进程是分配资源的最小单位 , 一旦创建一个进程就会分配一定的资源 , 就像跟两个人聊QQ就需要打开两个QQ软件一样是比较浪费资源的。

线程是程序执行的最小单位 , 实际上进程只负责分配资源 , 而利用这些资源执行程序的是线程 , 也就说进程是线程的容器 , 一个进程中最少有一个线程来负责执行程序 .  同时线程自己不拥有系统资源,只需要一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源 . 这就像通过一个QQ软件(一个进程)打开两个窗口(两个线程)跟两个人聊天一样 , 实现多任务的同时也节省了资源。

线程的创建

1. 导入线程模块
    import threading

2. 通过线程类创建线程对象
    线程对象 = threading.Thread(target=任务名) 

3. 启动线程执行任务
    线程对象.start()

# 创建子线程
coding_thread = threading.Thread(target=coding)
# 创建子线程
music_thread = threading.Thread(target=music)
# 启动线程
coding_thread.start()
music_thread.start()

线程注意事项

主线程不会等带所有子线程执行结束后,再结束。

#要想主线程不等待子线程执行完成可以设置守护主线程。
# 方法:设置守护线程
import threading

import time

def work():
    for i in range(10):
        print('work子线程正在执行。。。')
        time.sleep(0.2)


if __name__ == '__main__':
    # 只要程序运行,默认会产生一个主线程
    # 创建一个子线程,并设置守护线程
    sub_thread = threading.Thread(target=work, daemon=True)
    # 启动子线程
    sub_thread.start()
    # 让主线程休眠2s
    time.sleep(1)
    print('主线程执行结束!!!')


线程之间执行是无序的,是由CPU调度决定哪个线程先执行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值