python多进程与多线程

目录

多任务

什么是进程

多进程

多进程的作用

多进程代码实现

获取进程编号

多线程

多线程的作用

多线程代码实现

案例

1. 使用多线程实现批量探测网站是否存活


多任务

python多任务可以使用多进程或多线程完成。那什么是多任务了?如百度网盘下载东西,我们可以同时下载多个东西,即多个任务同时进行。

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

多任务的表现形式

 1. 并发

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

例子:对于单核cpu处理多任务,操作系统轮流让各个任务交替执行。

 2. 并行

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

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

什么是进程

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

多进程

多进程的作用

图中是一个非常简单的程序,一旦运行hello.py这个程序,按照代码的执行顺序,func_a函数执行完毕后才能执行func_b函数。如果可以让func_a和func_b同时运行,显然执行hello.py这个程序的效率会大大提升

使用多进程让这两个函数同时执行

多进程代码实现

1. 导入进程包

        import multiprocessing

2. 通过进程类创建进程对象

        进程对象 = multiprocessing.Process(target=任务名)

参数名说明
target执行的目标任务名,指的是函数名
函数参数(若有)args=(x,)   x为向函数传递的参数,必须为元组类型,如果只有一个参数则后面需要加,
kwargs={“name”:3}    以字典的方式给执行任务传参,name为形参,3为实参
name进程名,一般不用设置
group进程组,目前只能为None

3. 启动进程执行任务

        进程对象.start()

如下使用单任务执行,需要花费6秒的时间

from time import sleep
import time
start = time.time()
def sing():
    for i in range(3):
        print("唱歌...")
        sleep(1)
def dance():
    for i in range(3):
        print("跳舞...")
        sleep(1)
if __name__ == '__main__':
    sing()
    dance()
    end = time.time()
    print('程序运行时间:',end-start)

使用多进程,sing和dance两个函数是同时执行的,花费的时间少一半

#1.导包
import multiprocessing
from time import sleep
import time
start = time.time()
def sing():
    for i in range(3):
        print("唱歌...")
        sleep(1)
def dance():
    for i in range(3):
        print("跳舞...")
        sleep(1)
def main():
    #2.通过进程类创建进程对象
    sing_process = multiprocessing.Process(target=sing)
    dance_process = multiprocessing.Process(target=dance)
    #3.启动进程
    sing_process.start()
    dance_process.start()
    
if __name__ == '__main__':
    main()

获取进程编号

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

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

当这个程序运行起来的时候会有个主进程,然后启动了两个子进程,这两个子进程的父进程就是程序的主进程启动的。

#1.导包
import multiprocessing
from time import sleep
import time, os
start = time.time()
def sing():
    print("唱歌进程的pid:",os.getpid(),"父进程pid为:",os.getppid())
    for i in range(3):
        print("唱歌...")
        sleep(1)
def dance():
    print("跳舞进程的pid:",os.getpid(),"父进程pid为:",os.getppid())
    for i in range(3):
        print("跳舞...")
        sleep(1)
def main():
    #2.通过进程类创建2个进程对象
    sing_process = multiprocessing.Process(target=sing)
    dance_process = multiprocessing.Process(target=dance)
    #3.启动进程
    sing_process.start()
    dance_process.start()
    
if __name__ == '__main__':
    print("主进程pid为:",os.getpid())
    main()

 ps:主进程会等待所有子进程结束后才结束,如果想当主进程关闭的时候,所以子进程也结束,那么可以把设置守护主进程 —> 06-进程注意点_哔哩哔哩_bilibili

多线程

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

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

多线程的作用

多进程相当于我和多个人聊天需要同时打开多个qq,而多线程则相当于我只打开一个qq但是我在qq里面开启多个窗口

多线程代码实现

代码实现方式和多进程基本一致

1. 导入线程模块

        import threading

2. 通过线程类创建线程对象

        线程对象 = threading.Thread(target=任务名)

参数名说明
target执行的目标任务名,指的是函数名
函数参数(若有)

args=(x,)   x为向函数传递的参数,必须为元组类型,如果只有一个参数则后面需要加','

threading.Thread(target=sing, args=(3,))

kwargs={“name”:3}    以字典的方式给执行任务传参,name为形参,3为实参
name线程名,一般不用设置
group进程组,目前只能为None

3. 启动线程执行任务

        线程对象.start()

多线程实现案例

#1.导包
import threading
from time import sleep
import time
start = time.time()
def sing():
    for i in range(3):
        print("唱歌...")
        sleep(1)
def dance():
    for i in range(3):
        print("跳舞...")
        sleep(1)
def main():
    #2.通过线程类创建线程对象
    sing_process = threading.Thread(target=sing)
    dance_process = threading.Thread(target=dance)
    #3.启动线程
    sing_process.start()
    dance_process.start()
    
if __name__ == '__main__':
    main()

 ps:主线程会等待所有子线程结束后才结束,如果想当主线程关闭的时候,所以子线程也结束,那么可以把设置守护主线程

案例

写脚本推荐使用多线程而不是多进程

1. 使用多线程实现批量探测网站是否存活

对一批网站探测是否存活,如果不采用多线程,一个网站一个网站进行请求,则非常耗时

import threading
import requests
from requests.packages import urllib3
urllib3.disable_warnings()
headers={
    'User-Agent':'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Mobile Safari/537.36'
}
def alive(url):
    try:
        code = requests.get(url=url,headers=headers,verify=False,timeout=1.5).status_code
        if code == 200 or code == 404 or code == 403:
            print(url,"\t存活!")
        else:
            pass
    except:
        pass
for url in open("urls.txt","r",encoding="utf-8"):
    url = url.replace("\n","")
    t = threading.Thread(target=alive,args=(url,))
    t.start()

  • 8
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

~Echo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值