IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> python多进程、多线程 -> 正文阅读

[Python知识库]python多进程、多线程

说明
相应的学习视频见链接,本文只对重点进行总结。

B站视频-黑马程序,以及相应的黑马视频
课程同步的CSDN,写的细致

请添加图片描述

请添加图片描述

多进程

重点(只要看下面代码的main函数即可)

  1. 创建
  2. 如何开守护进程
  3. 多进程,开销大,用for循环调用多个进程时,后台cpu一下就上去了
import time
import multiprocessing
import os
def dance(who,num):
    print("dance父进程:{}".format(os.getppid()))
    for i in range(1,num+1):
        print("进行编号:{}————{}跳舞。。。{}".format(os.getpid(),who,i))
        time.sleep(0.5)


def sing(num):
    print("sing父进程:{}".format(os.getppid()))
    for i in range(1,num+1):
        print("进行编号:{}----唱歌。。。{}".format(os.getpid(),i))
        time.sleep(0.5)

def work():
    for i in range(10):
        print("工作中。。。")
        time.sleep(0.2)


if __name__ == '__main__':
    # print("main主进程{}".format(os.getpid()))
    start= time.time()

    #1 进程的创建与启动
    # # 1.1创建进程对象,注意dance不能加括号
    # # dance_process = multiprocessing.Process(target=dance)#1.无参数
    # dance_process=multiprocessing.Process(target=dance,args=("lin",3))#2.以args=元祖方式
    # sing_process = multiprocessing.Process(target=sing,kwargs={"num":3})#3.以kwargs={}字典方式
    # # 1.2启动进程
    # dance_process.start()
    # sing_process.start()

    #2.默认-主进程和子进程是分开的,主进程只要1s就可以完成,子进程要2s,主进程会等所有子进程执行完,再退出
    # 2.1子守护主进程,当主一但完成,子就断开(如qq一关闭,所有聊天窗口就没了).daemon=True
    work_process = multiprocessing.Process(target=work,daemon=True)
    work_process.start()

    time.sleep(1)
    print("主进程完成了!")#主进程和子进程是分开的,主进程只要1s就可以完成,子进程要2s,主进程会等所有子进程执行完,再退出
    print("main主进程花费时长:",time.time()-start)
    #

多线程

请添加图片描述
重点

  1. 创建
  2. 守护线程
  3. 线程安全问题(多人抢票,会抢到同一张)
import time
import os
import threading
def dance(num):

    for i in range(num):
        print("进程编号:{},线程编号:{}————跳舞。。。".format(os.getpid(),threading.current_thread()))
        time.sleep(1)


def sing(count):
    for i in range(count):
        print("进程编号:{},线程编号:{}----唱歌。。。".format(os.getpid(),threading.current_thread()))
        time.sleep(1)

def task():
    time.sleep(1)
    thread=threading.current_thread()
    print(thread)

if __name__ == '__main__':
    # start=time.time()
    # # sing_thread =threading.Thread(target=dance,args=(3,),daemon=True)#设置成守护主线程
    # sing_thread = threading.Thread(target=dance, args=(3,))
    # dance_thread = threading.Thread(target=sing,kwargs={"count":3})
    #
    # sing_thread.start()
    # dance_thread.start()
    #
    # time.sleep(1)
    # print("进程编号:{}主线程结束...用时{}".format(os.getpid(),(time.time()-start)))

    for i in range(10):#多线程之间执行是无序的,由cpu调度
        sub_thread = threading.Thread(target=task)
        sub_thread.start()

线程安全

B站链接
由于线程直接是无序进行的,且他们共享同一个进程的全部资源,所以会产生线程安全问题(比如多人在线抢票,买到同一张)

请添加图片描述
请添加图片描述
#下面代码在没有lock锁时,会卖出0票,加上lock就正常

import threading
import time
lock =threading.Lock()
class Sum_tickets:
    def __init__(self,tickets):
        self.tickets=tickets

def window(sum_tickets):

    while True:
        with lock:
            if sum_tickets.tickets>0:
                time.sleep(0.2)
                print(threading.current_thread().name,"取票{}".format(sum_tickets.tickets))
                sum_tickets.tickets-=1
            else:
                break

if __name__ == '__main__':
    sum_tickets=Sum_tickets(10)
    sub_thread1 = threading.Thread(name="窗口1",target=window,args=(sum_tickets,))
    sub_thread2 = threading.Thread(name="窗口2",target=window,args=(sum_tickets,))
    sub_thread1.start()
    sub_thread2.start()

高并发拷贝(多进程,多线程)


import os
import multiprocessing
import threading
import time
def copy_file(file_name,source_dir,dest_dir):
    source_path = source_dir+"/"+file_name
    dest_path =dest_dir+"/"+file_name
    print("当前进程为:{}".format(os.getpid()))
    with open(source_path,"rb") as source_file:
        with open(dest_path,"wb") as dest_file:
            while True:
                data=source_file.read(1024)

                if data:
                    dest_file.write(data)
                else:
                    break

    pass

if __name__ == '__main__':
    source_dir=r'C:\Users\Administrator\Desktop\注意力'
    dest_dir=r'C:\Users\Administrator\Desktop\test'

    start = time.time()
    try:
        os.mkdir(dest_dir)
    except:
        print("目标文件已存在")
    file_list =os.listdir(source_dir)
    count=0

    #1多进程
    for file_name in file_list:
        count+=1
        print(count)
        sub_processor=multiprocessing.Process(target=copy_file,
                                args=(file_name,source_dir,dest_dir))
        sub_processor.start()
        # time.sleep(20)
    print(time.time()-start)
#这里有主进程和子进程,通过打印可以看出,主进程在创建1,2,3,4,,,21过程中,子进程已有的开始执行,也就是说,每个进程是互不影响的
# 9
# 10
# 11
# 12
# 13
# 当前进程为:2936(当主进程创建第13个时,此时,第一个子进程开始工作)
# 14
# 当前进程为:10120
# 当前进程为:10440
# 15
# 当前进程为:9508

    # 2多线程
    # for file_name in file_list:
    #     count += 1
    #     print(count)
    #     sub_thread = threading.Thread(target=copy_file,
    #                                             args=(file_name, source_dir, dest_dir))
    #     sub_thread.start()
    #     # time.sleep(20)
    # print(time.time() - start)


  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-08-17 15:21:33  更:2021-08-17 15:23:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/26 11:26:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计