Python中的进程线程

news2024/11/14 8:22:05

文章目录

    • 前言
    • 多进程与多线程
      • 基本概念
      • 多进程
        • multiprocessing 类对象
        • 进程池
        • subprocess模块
        • 进程间通信
      • 多线程
        • threading实现线程操作
        • 线程共享所有变量
        • 线程锁
    • 参考资料

前言

又花了点时间学习了一下Python中的多线程与多进程的知识点,梳理一下供复习参考

多进程与多线程

基本概念

进程指的是程序的一次执行,它是系统资源分配的单位,不同进程间的资源互相独立,但是系统开销较大
线程是进程的执行单元,它是CPU调度的基本单位,线程能够共享进程的资源,它的优点是效率高,缺点是会影响所在的进程

多进程

multiprocessing 类对象

Python中的多进程常用multiprocessing库实现,支持跨平台的多进程操作,一个实例如下:

from multiprocessing import Process
import os
import time
def run_proc(name):
	print('子进程 %s PID: %s 已经启动...' % (name,os.getpid()))
	time.sleep(5)
	print('子进程 %s PID: %s 终止...' % (name,os.getpid()))

if __name__ == '__main__':
	print('父进程PID: %s' % (os.getpid()))
	p=Process(target=run_proc,args=('test',))
	print('子进程即将启动...')
	p.start() #启动进程,并调用该子进程中的p.run()
	p.join()  #阻塞当前所在进程,等待所有进程退出  #尝试注释此行观察程序执行变化
	print('主进程终止...')
  • 一个Processs对象就代表一个进程对象,传入的函数名及参数作为进程对象的参数
  • 使用start方法启动进程对象,默认调用子进程的run()方法
  • join方法表示等待进程结束,此实例中用p.join()表示主进程阻塞,等待子进程执行推出后再继续执行

进程池

利用进程池运行进程的实例如下:

from multiprocessing import Pool
import os,time,random

def long_time_task(name):
	print('子进程 %s 启动, PID: %s' % (name, os.getpid()) )
	stime=time.time()
	# time.sleep(random.random()*3)
	time.sleep(1)
	etime=time.time()
	print('子进程 %s 运行结束,耗时: %f' % (name,(etime-stime)))


if __name__ == '__main__':
	print('主进程启动,PID:',os.getpid())
	stime=time.time()
	p=Pool(2)  #Pool()中的参数表示最多能够同时运行几个进程,其余进程需要等到已运行进程结束后才能运行
	for i in range(6):
		p.apply_async(long_time_task,args=(i,))
	print('等待所有子进程运行结束...')
	p.close()
	p.join()
	etime=time.time()
	print('所有子进程运行结束,共耗时:',(etime-stime))

执行结果:
在这里插入图片描述
解释:

  • 每次同时运行两个进程,每个进程执行时间约1秒,共有6个进程,因此执行时间共为3秒
  • 如果注释掉 join()的话主进程会直接结束,看不到子进程的输出

subprocess模块

subprocess 模块允许我们启动一个新进程,并连接到它们的输入/输出/错误管道,从而获取返回值。
其中的subprocess.call()则可以调用windows系统cmd命令行执行额外的命令。

import subprocess

print('利用subprocess查询DNS...')
r=subprocess.call(['nslookup','baidu.com'])
print('返回状态码',r)

执行结果
在这里插入图片描述
解释:利用subprocess.call()类似于我们开启了一个新的命令窗口(新的进程),输入call()方法的参数,同时将命令执行结果的输出返回到当前进程的输出

进程间通信

multiprocessing模块提供了队列、管道等方式帮助进程之间交换数据
以下例子创建了两个进程,read进程向队列中读取数据,write进程向队列中写入数据

from multiprocessing import Process,Queue
import os,time,random

def write(q):
	print('write进程启动,PID:',os.getpid())
	for value in ['A','B','C','D']:
		print('将',value,'放入队列')
		q.put(value)
		time.sleep(1)

def read(q):
	print('read进程启动,PID:',os.getpid())
	while True:
		value=q.get()
		print('从队列中取出',value)
		pass

执行结果:
在这里插入图片描述

多线程

  • Python支持真正的多线程
  • 通常用_thread和threading两个模块实现Python多线程,后者更为常用
  • 线程执行的目标是函数,可以为线程命名

threading实现线程操作

import time,threading

def lp():
	print('线程',threading.current_thread().name,'正在运行')
	for i in range(3):
		print('线程进入第',i+1,'次循环')
		time.sleep(1)
	print('线程',threading.current_thread().name,'终止')

print('线程',threading.current_thread().name,'正在运行')
t=threading.Thread(target=lp,name='子线程')
t.start()
t.join()
print('线程',threading.current_thread().name,'终止')

执行结果
在这里插入图片描述

线程共享所有变量

以下是一个简单的例子,利用add和sub线程对共享变量进行修改

import time,threading
share=1000
def add():
	global share
	share+=5
	print('线程',threading.current_thread().name,'正在运行,变量share自增, share:',share)
	time.sleep(1)

def sub():
	global share
	share-=2
	print('线程',threading.current_thread().name,'正在运行,变量share自减, share:',share)
	time.sleep(1)

t1=threading.Thread(target=add,name='add')
t2=threading.Thread(target=sub,name='sub')
t1.start()
t2.start()
t1.join()
t2.join()
print('share:',share)

执行结果:
在这里插入图片描述

线程锁

让我们尝试修改一下上面的例子,add和sub线程随机修改三次共享变量share,没有线程锁时将出现混乱,我们无法预测哪个线程先对share变量进行修改,程序每次运行的结果可能会有不一样:

import time,threading,random

share=1000
lock=threading.Lock()

def add():
	global share
	#随机自增三次
	for i in range(3):
		share+=random.randint(1,10)
		print('线程',threading.current_thread().name,'正在运行,变量share随机自增, share:',share)
		time.sleep(random.random())

def sub():
	global share
	#随机自减三次
	for i in range(3):
		share-=random.randint(1,10)
		print('线程',threading.current_thread().name,'正在运行,变量share随机自减, share:',share)
		time.sleep(random.random())

t1=threading.Thread(target=add,name='add')
t2=threading.Thread(target=sub,name='sub')
t1.start()
t2.start()
t1.join()
t2.join()
print('share:',share)

运行结果:
在这里插入图片描述
加入线程锁之后,就可以等到某个线程执行结束后再执行另一个线程,不会出现交替执行的情况

import time,threading,random

share=1000
lock=threading.Lock()

def add():
	global share
	#随机自增三次
	try:
		lock.acquire()
		for i in range(3):
			share+=random.randint(1,10)
			print('线程',threading.current_thread().name,'正在运行,变量share随机自增, share:',share)
			time.sleep(random.random())
	finally:
		lock.release()
		

def sub():
	global share
	#随机自减三次
	try:
		lock.acquire()
		for i in range(3):
			share-=random.randint(1,10)
			print('线程',threading.current_thread().name,'正在运行,变量share随机自增, share:',share)
			time.sleep(random.random())
	finally:
		lock.release()

t1=threading.Thread(target=add,name='add')
t2=threading.Thread(target=sub,name='sub')
t1.start()
t2.start()
t1.join()
t2.join()
print('share:',share)

执行结果:
在这里插入图片描述

参考资料

Python正则表达式
Python多进程与多线程
subprocess.call()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/340402.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JUC并发编程与源码分析

一、本课程前置知识及要求说明 二、线程基础知识复习 三、CompletableFuture 四、说说Java"锁"事 8锁案例原理解释: 五、LockSupport与线程中断 六、 Java内存模型之JMM 七、volatile与JMM 八、CAS 九、原子操作类之18罗汉增强 十、聊聊ThreadLocal 十一、Java对…

离线数据仓库

1 数据仓库建模 1.1 建模工具 PowerDesigner/SQLYog/EZDML… 1.2 ODS层 (1)保持数据原貌不做任何修改,起到备份数据的作用。 (2)数据采用压缩,减少磁盘存储空间(例如:压缩采用LZO&…

seata源码-全局事务回滚服务端源码

这篇博客来记录在发起全局事务回滚时,服务端接收到netty请求是如何处理的 1. 发起全局事务回滚请求 在前面的博客中,有说到过,事务发起者在发现分支事务执行异常之后,会提交全局事务回滚的请求到netty服务端,这里是发…

Python 解决dilb和face_recognition第三方包安装失败

目录 dilb和face_recognition第三方包安装失败 亲测有效的解决方法:whl安装方式 dilb和face_recognition第三方包安装失败 场景复现:因为需要用到dlibface_recognition,基于OpenCV做一些人脸识别的项目,在Pycharm中进行pip清华…

图解LeetCode——剑指 Offer 24. 反转链表

一、题目 定义一个函数&#xff0c;输入一个链表的头节点&#xff0c;反转该链表并输出反转后链表的头节点。 二、示例 示例: 【输入】 1->2->3->4->5->NULL 【输出】 5->4->3->2->1->NULL 限制&#xff1a; 0 < 节点个数 < 5000 三、…

Linux | Linux卸载和安装MySQL(Ubuntu版)

最近又来到了Linux学习了&#xff0c;原因是要接触云服务器相关知识&#xff0c; 所以博主整理了一些关于Linux的知识&#xff0c; 欢迎各位朋友点赞收藏&#xff0c;天天开心丫&#xff0c;快乐写代码&#xff01; Linux系列文章请戳 Linux教程专栏 目录 一、卸载MySQL 1…

Angular4 中 ckeditor5 插件的使用

Angular4 中 ckeditor5 插件的使用 0 环境、新建项目 环境&#xff1a; Windows10Angular/cli1.4.10&#xff08;安装 Angular 的过程略过&#xff0c;Angular4 版本比较古老&#xff0c;这也导致项目安装插件及其他操作比较麻烦&#xff09; 1. ckeditor5 官方用法 基础用…

邂逅TypeScript基础语法

文章目录p26认识TypeScriptTypeScript的编译环境ts初体验ts环境搭建变量的定义p27number类型booleanArrayObjectSymbolanyunknownvoidnevertuple联合ts中文文档学习-非官方网站 p26 认识TypeScript TypeScript的编译环境 ts初体验 ts环境搭建 第二种方式 webpack.config…

论文阅读_图像生成文本_CLIP

name_en: Learning Transferable Visual Models From Natural Language Supervision name_ch: 从自然语言监督中学习可迁移的视觉模型 paper_addr: http://arxiv.org/abs/2103.00020 doi: 10.48550/arXiv.2103.00020 date_read: 2023-02-09 date_publish: 2021-02-26 tags: [‘…

【1138. 字母板上的路径】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 我们从一块字母板上的位置 (0, 0) 出发&#xff0c;该坐标对应的字符为 board[0][0]。 在本题里&#xff0c;字母板为 board ["abcde", "fghij", "klmno", "pq…

文本比对工具【UltraCompare附安装包】Mac和Windows下载使用

UltraCompare 强大的文件&#xff0c;文件夹&#xff0c;PDF, Word和Excel比较。文件夹同步&#xff0c;二进制/十六进制比较。下载一个免费的全功能试用版&#xff0c;看看为什么。适用于Windows、Mac和Linux。 文章目录软件功能1、文本比较2、快速二进制比较3、智慧二进制比较…

Python快速上手系列--类--详解篇

本章是自动化测试的真正开始&#xff0c;因为在后续的过程中&#xff0c;你会接触到unittest框架&#xff0c;pytest框架&#xff0c;而不仅仅只是写一个函数selenium脚本这么简单了。1、创建类1.1、了解类我们首先了解一下&#xff0c;为什么要使用类&#xff0c;类可以拿来干…

2023同等学力申请硕士计算机综合国考

同等学力国考报名要开始了 2023年2月15日&#xff0c;中国教育考试网和“全国同等学力人员申请硕士学位管理工作信息平台”&#xff08;https://tdxl.chsi.com.cn&#xff0c;联系服务电话&#xff1a;010-67410388&#xff09;公布报名工作通知。考生须按照通知要求进行注册或…

Win11下Linux子系统迁移方法及报错解决

Win11 将Linux子系统从C盘迁移到其他盘Win11下Linux子系统迁移方法及报错解决1、下载LxRunOffline2、ERROR&#xff1a;directory is not empty 报错解决参考链接Win11下Linux子系统迁移方法及报错解决 C盘满了&#xff0c;Ubuntu子系统占了100多G怎么办&#xff1f;直接将子系…

相机出图画面一半清晰,一半模糊的原因是什么?

1、问题背景&#xff1a;在做项目的过程中&#xff0c;有遇到过几次&#xff0c;出图后画面是一半清晰&#xff0c;一半模糊的现象&#xff0c;再重新对焦也是一样。但换了个镜头后就好了&#xff0c;这应该是镜头的质量问题&#xff0c;但导致镜头出现这种问题的具体原因是什么…

【2023unity游戏制作-mango的冒险】-3.基础动作和动画API实现

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 秩沅 原创 收录于专栏&#xff1a;unity游戏制作 ⭐mango的基础动作动画的添加⭐ 文章目录⭐mango的基础动作动画的添加⭐&#x1f…

本周大新闻|传微软解散工业元宇宙团队,MIT研发垂直堆叠全彩Micro LED

本周大新闻&#xff0c;AR方面&#xff0c;消息称微软解散工业元宇宙团队&#xff1b;德国AR公司Gixel GmbH亮相&#xff1b;Brilliant推出单片式附加形态AR眼镜&#xff1b;MIT研发垂直堆叠全彩Micro LED&#xff1b;谷歌XR串流正式上线。VR方面&#xff0c;索尼发布了PS VR2的…

【手写 Vuex 源码】第八篇 - Vuex 的 State 状态安装

一&#xff0c;前言 上一篇&#xff0c;主要介绍了 Vuex 模块安装的实现&#xff0c;针对 action、mutation、getter 的收集与处理&#xff0c;主要涉及以下几个点&#xff1a; Vuex 模块安装的逻辑&#xff1b;Vuex 代码优化&#xff1b;Vuex 模块安装的实现&#xff1b;Vue…

leetcode-每日一题-2335(简单,贪心)

自己打表看一下过程就可以发现&#xff0c;其实就是每次选两个大的进行--之后秒数加1即可现有一台饮水机&#xff0c;可以制备冷水、温水和热水。每秒钟&#xff0c;可以装满 2 杯 不同 类型的水或者 1 杯任意类型的水。给你一个下标从 0 开始、长度为 3 的整数数组 amount &am…

元学习(Meta Learning)最全论文、视频、书籍资源整理

Meta Learning&#xff0c;叫做元学习或者 Learning to Learn 学会学习&#xff0c;包括Zero-Shot/One-Shot/Few-Shot 学习&#xff0c;模型无关元学习(Model Agnostic Meta Learning)和元强化学习&#xff08;Meta Reinforcement Learning&#xff09;。元学习是人工智能领域&…