热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python对象锁_Python学习之进程和线程

Python学习之进程和线程Python学习目录在Mac下使用Python3Python学习之数据类型Python学习之函数Python学习之高级特性Python学习之函数式编程P
Python学习之进程和线程

Python学习目录

  1. 在Mac下使用Python3
  2. Python学习之数据类型
  3. Python学习之函数
  4. Python学习之高级特性
  5. Python学习之函数式编程
  6. Python学习之模块
  7. Python学习之面向对象编程
  8. Python学习之面向对象高级编程
  9. Python学习之错误调试和测试
  10. Python学习之IO编程
  11. Python学习之进程和线程
  12. Python学习之正则
  13. Python学习之常用模块
  14. Python学习之网络编程

对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程,打开一个Word就启动了一个Word进程。

有些进程还不止同时干一件事,比如Word,它可以同时进行打字、拼写检查、打印等事情。在一个进程内部,要同时干多件事,就需要同时运行多个“子任务”,我们把进程内的这些“子任务”称为线程(Thread)。

a93d74e94f1b9831feed0b684ea3949e.png
进程

Python的os模块封装了常见的系统调用,其中包括fork,可以在Python程序中轻松创建子进程:

import osprint('Process (%s) start...' % os.getpid())# Only works on Unix/Linux/Mac:pid = os.fork()if pid == 0: print('I am child process (%s) and my parent is %s.' % (os.getpid(), os.getppid()))else: print('I (%s) just created a child process (%s).' % (os.getpid(), pid))

运行结果如下:

Process (876) start...I (876) just created a child process (877).I am child process (877) and my parent is 876.

由于Windows没有fork调用,上面的代码在Windows上无法运行。由于Mac系统是基于BSD(Unix的一种)内核,所以,在Mac下运行是没有问题的,推荐大家用Mac学Python!

multiprocessing

如果你打算编写多进程的服务程序,Unix/Linux无疑是正确的选择。由于Windows没有fork调用,难道在Windows上无法用Python编写多进程的程序?

由于Python是跨平台的,自然也应该提供一个跨平台的多进程支持。multiprocessing模块就是跨平台版本的多进程模块。

multiprocessing模块提供了一个Process类来代表一个进程对象,下面的例子演示了启动一个子进程并等待其结束:

from multiprocessing import Processimport os# 子进程要执行的代码def run_proc(name): print('Run child process %s (%s)...' % (name, os.getpid()))if __name__=='__main__': print('Parent process %s.' % os.getpid()) p = Process(target=run_proc, args=('test',)) print('Child process will start.') p.start() p.join() print('Child process end.')

执行结果如下:

Parent process 928.Process will start.Run child process test (929)...Process end.

创建子进程时,只需要传入一个执行函数和函数的参数,创建一个Process实例,用start()方法启动,这样创建进程比fork()还要简单。

join()方法可以等待子进程结束后再继续往下运行,通常用于进程间的同步。

线程

Python的标准库提供了两个模块:_thread和threading,_thread是低级模块,threading是高级模块,对_thread进行了封装。绝大多数情况下,我们只需要使用threading这个高级模块。

启动一个线程就是把一个函数传入并创建Thread实例,然后调用start()开始执行:

import time, threading# 新线程执行的代码:def loop(): print(&#39;thread %s is running...&#39; % threading.current_thread().name) n &#61; 0 while n <5: n &#61; n &#43; 1 print(&#39;thread %s >>> %s&#39; % (threading.current_thread().name, n)) time.sleep(1) print(&#39;thread %s ended.&#39; % threading.current_thread().name)print(&#39;thread %s is running...&#39; % threading.current_thread().name)t &#61; threading.Thread(target&#61;loop, name&#61;&#39;LoopThread&#39;)t.start()t.join()print(&#39;thread %s ended.&#39; % threading.current_thread().name)

执行结果如下&#xff1a;

thread MainThread is running...thread LoopThread is running...thread LoopThread >>> 1thread LoopThread >>> 2thread LoopThread >>> 3thread LoopThread >>> 4thread LoopThread >>> 5thread LoopThread ended.thread MainThread ended.Lock

多线程和多进程最大的不同在于&#xff0c;多进程中&#xff0c;同一个变量&#xff0c;各自有一份拷贝存在于每个进程中&#xff0c;互不影响&#xff0c;而多线程中&#xff0c;所有变量都由所有线程共享&#xff0c;所以&#xff0c;任何一个变量都可以被任何一个线程修改&#xff0c;因此&#xff0c;线程之间共享数据最大的危险在于多个线程同时改一个变量&#xff0c;把内容给改乱了。

balance &#61; 0lock &#61; threading.Lock()def run_thread(n): for i in range(100000): # 先要获取锁: lock.acquire() try: # 放心地改吧: change_it(n) finally: # 改完了一定要释放锁: lock.release()

当多个线程同时执行lock.acquire()时&#xff0c;只有一个线程能成功地获取锁&#xff0c;然后继续执行代码&#xff0c;其他线程就继续等待直到获得锁为止。

获得锁的线程用完后一定要释放锁&#xff0c;否则那些苦苦等待锁的线程将永远等待下去&#xff0c;成为死线程。所以我们用try...finally来确保锁一定会被释放。

ThreadLocal

import threading# 创建全局ThreadLocal对象:local_school &#61; threading.local()def process_student(): # 获取当前线程关联的student: std &#61; local_school.student print(&#39;Hello, %s (in %s)&#39; % (std, threading.current_thread().name))def process_thread(name): # 绑定ThreadLocal的student: local_school.student &#61; name process_student()t1 &#61; threading.Thread(target&#61; process_thread, args&#61;(&#39;Alice&#39;,), name&#61;&#39;Thread-A&#39;)t2 &#61; threading.Thread(target&#61; process_thread, args&#61;(&#39;Bob&#39;,), name&#61;&#39;Thread-B&#39;)t1.start()t2.start()t1.join()t2.join()

执行结果&#xff1a;

Hello, Alice (in Thread-A)Hello, Bob (in Thread-B)

全局变量local_school就是一个ThreadLocal对象&#xff0c;每个Thread对它都可以读写student属性&#xff0c;但互不影响。你可以把local_school看成全局变量&#xff0c;但每个属性如local_school.student都是线程的局部变量&#xff0c;可以任意读写而互不干扰&#xff0c;也不用管理锁的问题&#xff0c;ThreadLocal内部会处理。

可以理解为全局变量local_school是一个dict&#xff0c;不但可以用local_school.student&#xff0c;还可以绑定其他变量&#xff0c;如local_school.teacher等等。

ThreadLocal最常用的地方就是为每个线程绑定一个数据库连接&#xff0c;HTTP请求&#xff0c;用户身份信息等&#xff0c;这样一个线程的所有调用到的处理函数都可以非常方便地访问这些资源。

下一篇&#xff1a;Python学习之正则参考文献&#xff1a;K码农-http://kmanong.top/kmn/qxw/form/home?top_cate&#61;28



推荐阅读
  • 反向投影技术主要用于在大型输入图像中定位特定的小型模板图像。通过直方图对比,它能够识别出最匹配的区域或点,从而确定模板图像在输入图像中的位置。 ... [详细]
  • 本问题探讨了在特定条件下排列儿童队伍的方法数量。题目要求计算满足条件的队伍排列总数,并使用递推算法和大数处理技术来解决这一问题。 ... [详细]
  • 哈密顿回路问题旨在寻找一个简单回路,该回路包含图中的每个顶点。本文将介绍如何判断给定的路径是否构成哈密顿回路。 ... [详细]
  • 方法:1 配置数据库basediros.path.abspath(os.path.dirname(__file__))  #获取当前文件的绝对路径appFlask(__name__ ... [详细]
  • 阿里云ecs怎么配置php环境,阿里云ecs配置选择 ... [详细]
  • 深入理解Lucene搜索机制
    本文旨在帮助读者全面掌握Lucene搜索的编写步骤、核心API及其应用。通过详细解析Lucene的基本查询和查询解析器的使用方法,结合架构图和代码示例,带领读者深入了解Lucene搜索的工作流程。 ... [详细]
  • 在项目部署后,Node.js 进程可能会遇到不可预见的错误并崩溃。为了及时通知开发人员进行问题排查,我们可以利用 nodemailer 插件来发送邮件提醒。本文将详细介绍如何配置和使用 nodemailer 实现这一功能。 ... [详细]
  • 本文详细探讨了JavaScript中的作用域链和闭包机制,解释了它们的工作原理及其在实际编程中的应用。通过具体的代码示例,帮助读者更好地理解和掌握这些概念。 ... [详细]
  • Python 内存管理机制详解
    本文深入探讨了Python的内存管理机制,涵盖了垃圾回收、引用计数和内存池机制。通过具体示例和专业解释,帮助读者理解Python如何高效地管理和释放内存资源。 ... [详细]
  • 嵌入式开发环境搭建与文件传输指南
    本文详细介绍了如何为嵌入式应用开发搭建必要的软硬件环境,并提供了通过串口和网线两种方式将文件传输到开发板的具体步骤。适合Linux开发初学者参考。 ... [详细]
  • 本文介绍了Linux系统中的文件IO操作,包括文件描述符、基本文件操作函数以及目录操作。详细解释了各个函数的参数和返回值,并提供了代码示例。 ... [详细]
  • 本文详细介绍了 org.apache.commons.io.IOCase 类中的 checkCompareTo() 方法,通过多个代码示例展示其在不同场景下的使用方法。 ... [详细]
  • 本文详细介绍了如何在预装Ubuntu系统的笔记本电脑上安装Windows 7。针对没有光驱的情况,提供了通过USB安装的具体方法,并解决了分区、驱动器无法识别等问题。 ... [详细]
  • Linux系统中Java程序Too Many Open Files问题的深入解析与解决方案
    本文详细分析了在Linux环境下运行的Java应用程序中可能出现的“Too many open files”异常现象,探讨其成因及解决方法。该问题通常出现在高并发文件访问或大量网络连接场景下,对系统性能和稳定性有较大影响。 ... [详细]
  • 本题来自WC2014,题目编号为BZOJ3435、洛谷P3920和UOJ55。该问题描述了一棵不断生长的带权树及其节点上小精灵之间的友谊关系,要求实时计算每次新增节点后树上所有可能的朋友对数。 ... [详细]
author-avatar
小白一枚
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有