我的编程空间,编程开发者的网络收藏夹
学习永远不晚

手把手带你了解python多进程,多线程

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

手把手带你了解python多进程,多线程

说明

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

请添加图片描述

请添加图片描述

多进程

重点(只要看下面代码的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()

线程安全

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

请添加图片描述
请添加图片描述

#下面代码在没有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)

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注编程网的更多内容!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

手把手带你了解python多进程,多线程

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

手把手带你了解Python数据分析--matplotlib

目录柱形图条形图折线图饼图和圆环图分离饼图块圆环图总结柱形图 bar()函数绘制柱形图import matplotlib.pyplot as pl x = [1,2,3,4,5,6,7] y = [15,69,85,12,36,95,11]
2022-06-10

深入理解 Python 中的多线程 新手必看

示例1 我们将要请求五个不同的url: 单线程import time import urllib2defget_responses():urls=[‘http://www.baidu.com',‘http://www.amazon.com'
2022-06-04

带你了解Python进程管理神器Supervisor

本篇文章给大家带来了关于Python的相关知识,Supervisor 是一款 Python 开发的进程管理系统,允许用户监视和控制 Linux 上的进程,能将一个普通命令行进程变为后台守护进程,异常退出时能自动重启,下面一起来看一下,希望对大家有帮助。【相关推荐:Python3视频教程 】一、简介Supervisor 是一款 Python 开发的进程管理系统,允许用户监视和控制 Linux 上的进程
2022-08-08

python并发编程之多进程、多线程、异步和协程详解

最近学习python并发,于是对多进程、多线程、异步和协程做了个总结。 一、多线程多线程就是允许一个进程内存在多个控制权,以便让多个函数同时处于激活状态,从而让多个函数的操作同时运行。即使是单CPU的计算机,也可以通过不停地在不同线程的指令
2022-06-04

Python 多线程与多进程:进阶指南,解锁并发编程的更多可能性

Python 多线程与多进程是两种重要的并发编程技术,它能够充分利用计算机的处理能力,提高程序的执行效率。本文将深入探讨 Python 多线程和多进程的原理、使用方式以及常见的应用场景,帮助你解锁并发编程的更多可能性。
Python 多线程与多进程:进阶指南,解锁并发编程的更多可能性
2024-02-24

学Java线程,你不知道什么是AQS?一文带你了解Java多线程同步的灵魂

关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、人工智能等,希望大家多多支持。 目录 一、导读1.1 CLH锁 二、概览三、使用场景3.1
2023-08-17

一文带你掌握Python中多线程和线程池的使用方法

Python中的多线程和线程池是其强大的功能之一,可以让我们更加高效地利用CPU资源,提高程序的运行速度。本文将介绍Python中多线程和线程池的使用方法,并提供一些实用的案例供读者参考
2023-05-16

Python学习教程:手把手教你Sublime Text编辑器配置Python解释器

前天有个伙伴问我一个关于Sublime text配置Python解释器的问题,也可能是初学者,对这方面还不是很懂,想使用快捷键但是徒劳一场,因为缺少Python解释器,直接按下快捷键Ctrl+B是不会得到想要的结果的。鉴于此,如果有小伙伴想
2023-06-02

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录