python多进程和多线程

import time

def sing():
    for i in range(3):
        print("唱歌")
        time.sleep(0.5)
def dance():
    for i in range(3):
        print("跳舞")
        time.sleep(0.5)
if __name__ == "__main__":
    before = time.time()
    sing()
    dance()
    after = time.time()
    print(f"花费时间{after - before}")#3秒多

 上面这个就是一个默认主进程

import time
from multiprocessing import Process
#multiprocessing是python中的进程包,从这里面导入可以实例化成进程对象的进程类Process

def sing():
    for i in range(3):
        print("唱歌")
        time.sleep(0.5)
def dance():
    for i in range(3):
        print("跳舞")
        time.sleep(0.5)
if __name__ == "__main__":
    before = time.time()#返回高精度浮点数
    sing_process=Process(target=sing)
    dance_process=Process(target=dance)

    sing_process.start()#对应进程对象启动进程执行函数或者其他任务
    dance_process.start()#上面的进程先启动,但是这俩开始结束时间都差不多(在有时间延迟的条件上),否则也可以说差蛮多
    after = time.time()
    print(f"花费时间{after - before}")#这个和下面%s的精度一样,都比%f的精度高很多
    print("花费时间%s" % (after - before))
    print("花费时间%f" % (after - before))#这个小数点后6位

"""
花费时间0.011434316635131836
花费时间0.011434316635131836
花费时间0.011434
唱歌
跳舞
唱歌
跳舞
唱歌
跳舞

"""
#正是因为有时间延迟,才能一定程度上保证交替显示函数结果

 上面这是没有参数的任务的俩非主进程对象的创建和开启,(比子进程先启动的主进程)的任务可能一下子就没了但是他一定会等子进程都结束后再结束

下面是有参数任务的

import time
from multiprocessing import Process
#multiprocessing是python中的进程包,从这里面导入可以实例化成进程对象的进程类Process

def sing(a,b):
    for i in range((a-b)):
        print("唱歌")
        time.sleep(0.5)
def dance(fack,num):
    for i in range((fack-num)):
        print("跳舞")
        time.sleep(0.5)
if __name__ == "__main__":
    before = time.time()#返回高精度浮点数
    sing_process=Process(target=sing,args=(4,1))#args就是用元组对应盲传,元组最起码要有一个逗号,参数不多不少
    dance_process=Process(target=dance,kwargs={'num':1,'fack':4})#kwargs就是用字典的键对应形参名来传参数值,要提前知道形参名,好处是就不用对应顺序

    sing_process.start()#对应进程对象启动进程自动调用执行对应函数或者其他任务
    dance_process.start()#无参任务时上面的进程先启动,但是这俩开始结束时间都差不多(在有时间延迟的条件上),否则也可以说差蛮多
    #传递参数要时间,会拖慢进程对象启动,所以先后没有绝对,并且,上面的出错不会影响下面的非主进程和主进程执行
    after = time.time()
    print(f"花费时间{after - before}")#这个和下面%s和直接输出的精度一样,都比%f的精度高很多
    print("花费时间%s" % (after - before))
    print("花费时间",(after - before))  
    print("花费时间%f" % (after - before))#这个小数点后6位

"""
花费时间0.011434316635131836
花费时间0.011434316635131836
花费时间0.011434316635131836
花费时间0.011434
唱歌
跳舞
唱歌
跳舞
唱歌
跳舞

"""
#正是因为有时间延迟,才能一定程度上保证交替显示函数结果

下面这个是在验证主进程就是非主进程的父进程



import time
from multiprocessing import Process
#multiprocessing是python中的进程包,从这里面导入可以实例化成进程对象的进程类Process
import os
def sing(a,b):
    print("唱歌进程的pid:",os.getpid())
    print("唱歌父进程的pid:",os.getppid())
    for i in range((a-b)):
        print("唱歌")
        time.sleep(0.5)
def dance(fack,num):
    print("跳舞进程的pid:", os.getpid())
    print("跳舞父进程的pid:", os.getppid())
    for i in range((fack-num)):
        print("跳舞")
        time.sleep(0.5)
if __name__ == "__main__":
    print("主进程的pid",os.getpid())#主进程就是非主进程的父进程,因为非主进程对象是在主进程中创建并启动的
    before = time.time()#返回高精度浮点数
    sing_process=Process(target=sing,args=(4,1))#args就是用元组对应盲传,元组最起码要有一个逗号,参数不多不少

    dance_process=Process(target=dance,kwargs={'num':1,'fack':4})#kwargs就是用字典的键对应形参名来传参数值,要提前知道形参名,好处是就不用对应顺序

    sing_process.start()#对应进程对象启动进程执行函数或者其他任务
    dance_process.start()#无参任务时上面的进程先启动,但是这俩开始结束时间都差不多(在有时间延迟的条件上),否则也可以说差蛮多
    #传递参数要时间,会拖慢进程对象启动,所以先后没有绝对,并且,上面的出错不会影响下面的非主进程和主进程执行
    after = time.time()
    print(f"花费时间{after - before}")#这个和下面%s和直接输出的精度一样,都比%f的精度高很多
    print("花费时间%s" % (after - before))
    print("花费时间",(after - before))
    print("花费时间%f" % (after - before))#这个小数点后6位


"""
主进程的pid 5432
花费时间0.012730598449707031
花费时间0.012730598449707031
花费时间 0.012730598449707031
花费时间0.012731
唱歌进程的pid: 11388
跳舞进程的pid: 7068
唱歌父进程的pid: 5432
唱歌
跳舞父进程的pid: 5432
跳舞
唱歌
跳舞
唱歌
跳舞


"""
#正是因为有时间延迟,才能一定程度上保证交替显示函数结果




下面这个是子进程保护父进程(主进程)的代码实例

import time
from multiprocessing import Process
# multiprocessing是python中的进程包,从这里面导入可以实例化成进程对象的进程类Process
import os


def sing(a, b):

    for i in range((a - b)):
        print("唱歌")
        time.sleep(0.5)


def dance(fack, num):

    for i in range((fack - num)):
        print("跳舞")
        time.sleep(0.5)


if __name__ == "__main__":

    before = time.time()
    sing_process = Process(target=sing, args=(4, 1))
    dance_process = Process(target=dance, kwargs={'num': 1, 'fack': 4})

    sing_process.daemon=True
    #由于这里父进程(主进程)任务很快没了,又让sing_process子进程守护父进程,也就是父进程任务结束,这个子进程就彻底结束
    #这时父进程如果还有其他的子进程就不会彻底结束
    sing_process.start()
    dance_process.start()
    after = time.time()
    print(f"花费时间{after - before}")


下面这个是主进程循环里有函数模块直接换高并发的黑马高并发copy器实例:

import os
import time
from multiprocessing import Process


def copy_file(filename, source_dir, dest_dir):
    source_path = source_dir + '\\' + filename
    dest_path = dest_dir + '\\' + filename
    # 想要对文件进行copy转移,就要知道源文件和目标文件的绝对路径,就是上面这俩

    print(source_path + '------------->' + dest_path)

    with open(source_path, "rb") as source_dile:
        with open(dest_path, "wb") as dest_dile:
            # 这俩with就是可以自己关闭这俩文件指针,源文件二进制读取,目标文件二进制写
            while True:
                data = source_dile.read(1024)  # 对同一个文件循环读取,文件指针自己会走,一次读1kb
                if data:
                    dest_dile.write(data)
                else:
                    break
    print(time.time())


if __name__ == "__main__":
    print(time.time())
    source_dir = r"D:\qq文件下载\面经"
    dest_dir = r"C:\Users\86193\Desktop\YYDSdest_dir"
    try:
        os.mkdir(dest_dir)
    except OSError:
        print("已婚,快走开")

    file_list = os.listdir(source_dir)
    for file_name in file_list:
        # copy_file(file_name, source_dir,dest_dir)这是只有主进程
        # 我们要用多子进程高并发,用同一个进程对象名不断指向新的进程对象内存空间
        # 说白了就是不同状态的copy_file函数几乎同时执行,大大减少时间
        sub_process = Process(target=copy_file, args=(file_name, source_dir, dest_dir))  # 需要三个参数,我们这里用元组对应顺序传参
        sub_process.start()

        # 经过验证,非常好用,yyds



"""0.1755038"""

多线程版本

import os
import time

from threading import Thread


def copy_file(filename, source_dir, dest_dir):
    source_path = source_dir + '\\' + filename
    dest_path = dest_dir + '\\' + filename
    # 想要对文件进行copy转移,就要知道源文件和目标文件的绝对路径,就是上面这俩

    print(source_path + '------------->' + dest_path)

    with open(source_path, "rb") as source_dile:
        with open(dest_path, "wb") as dest_dile:
            # 这俩with就是可以自己关闭这俩文件指针,源文件二进制读取,目标文件二进制写
            while True:
                data = source_dile.read(1024)  # 对同一个文件循环读取,文件指针自己会走,一次读1kb
                if data:
                    dest_dile.write(data)
                else:
                    break
    print(time.time())


if __name__ == "__main__":
    print(time.time())
    source_dir = r"D:\qq文件下载\面经"
    dest_dir = r"C:\Users\86193\Desktop\YYDSdest_dir"
    try:
        os.mkdir(dest_dir)
    except OSError:
        print("已婚,快走开")

    file_list = os.listdir(source_dir)
    for file_name in file_list:
        # copy_file(file_name, source_dir,dest_dir)这是只有主线程
        # 我们要用多子线程高并发,用同一个线程对象名不断指向新的线程对象内存空间
        # 说白了就是不同状态的copy_file函数几乎同时执行,大大减少时间
        sub_thread = Thread(target=copy_file, args=(file_name, source_dir, dest_dir))  # 需要三个参数,我们这里用元组对应顺序传参
        sub_thread.start()




    # 经过验证,非常好用,yyds,而且这玩意如果之前目标同名文件已经有了只会更新,不报错
"""0.008163"""

 io操作中python多进程不如多线程高,多进程还得用在cpu计算密集任务上


下面是我复制几个jpg图片的时间

多线程:0.008163

多进程:0.1755038

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值