热门标签 | 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



推荐阅读
  • Zabbix自定义监控与邮件告警配置实践
    本文详细介绍了如何在Zabbix中添加自定义监控项目,配置邮件告警功能,并解决测试告警时遇到的邮件不发送问题。 ... [详细]
  • 函子(Functor)是函数式编程中的一个重要概念,它不仅是一个特殊的容器,还提供了一种优雅的方式来处理值和函数。本文将详细介绍函子的基本概念及其在函数式编程中的应用,包括如何通过函子控制副作用、处理异常以及进行异步操作。 ... [详细]
  • 本文探讨了Python类型注解使用率低下的原因,主要归结于历史背景和投资回报率(ROI)的考量。文章不仅分析了类型注解的实际效用,还回顾了Python类型注解的发展历程。 ... [详细]
  • JUnit下的测试和suite
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • OBS Studio自动化实践:利用脚本批量生成录制场景
    本文探讨了如何利用OBS Studio进行高效录屏,并通过脚本实现场景的自动生成。适合对自动化办公感兴趣的读者。 ... [详细]
  • 本文详细介绍了在Luat OS中如何实现C与Lua的混合编程,包括在C环境中运行Lua脚本、封装可被Lua调用的C语言库,以及C与Lua之间的数据交互方法。 ... [详细]
  • 本文详细介绍如何在 Apache 中设置虚拟主机,包括基本配置和高级设置,帮助用户更好地理解和使用虚拟主机功能。 ... [详细]
  • Hanks博士是一位著名的生物技术专家,他的儿子Hankson对数学有着浓厚的兴趣。最近,Hankson遇到了一个有趣的数学问题,涉及求解特定条件下的正整数x,而不使用传统的辗转相除法。 ... [详细]
  • 本文详细解析了MySQL中常见的几种错误,并提供了具体的解决方法,帮助开发者快速定位和解决问题。 ... [详细]
  • 本文提供了一种有效的方法来解决当Android Studio因电脑意外重启而导致的所有import语句出现错误的问题。通过清除缓存和重建项目结构,可以快速恢复开发环境。 ... [详细]
  • 本文将详细探讨 Python 编程语言中 sys.argv 的使用方法及其重要性。通过实际案例,我们将了解如何在命令行环境中传递参数给 Python 脚本,并分析这些参数是如何被处理和使用的。 ... [详细]
  • 本文探讨了如何在PHP与MySQL环境中实现高效的分页查询,包括基本的分页实现、性能优化技巧以及高级的分页策略。 ... [详细]
  • 在尝试加载支持推送通知的iOS应用程序的Ad Hoc构建时,遇到了‘no valid aps-environment entitlement found for application’的错误提示。本文将探讨此错误的原因及多种可能的解决方案。 ... [详细]
  • 长期从事ABAP开发工作的专业人士,在面对行业新趋势时,往往需要重新审视自己的发展方向。本文探讨了几位资深专家对ABAP未来走向的看法,以及开发者应如何调整技能以适应新的技术环境。 ... [详细]
  • 本文探讨了如何将个人经历,特别是非传统的职业路径,转化为职业生涯中的优势。通过作者的亲身经历,展示了舞蹈生涯对商业思维的影响。 ... [详细]
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社区 版权所有