一 threading 模块介绍

multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性

二 开启线程的两种方式

"""
方式一:直接调用threading模块下 Thread 类方法
"""
from threading import Thread
import timedef sayhi(name):time.sleep(2)print('%s say hello' %name)if __name__ == '__main__':t=Thread(target=sayhi,args=('egon',))t.start()print('主线程')"""
方式二:继承Thread类,重写run()方法
"""
from threading import Thread
import timeclass Sayhi(Thread):def __init__(self,name):super().__init__()self.name=namedef run(self):time.sleep(2)print('%s say hello' % self.name)if __name__ == '__main__':t = Sayhi('egon')t.start()print('主线程')

三 在一个进程下开启多线程和在一个进程下开启多个子进程的区别

谁开启的速度快

"""
在主进程下开启线程
"""
from threading import Threaddef work():print('hello')if __name__ == '__main__':t=Thread(target=work)t.start()print('主线程/主进程')
# 执行结果如下,几乎是t.start ()的同时就将线程开启了,然后先打印出了hello,证明线程的创建开销极小
hello
主线程/主进程"""
在主进程下开启子进程
"""
from multiprocessing import Processdef work():print('hello')if __name__ == '__main__':#在主进程下开启子进程p=Process(target=work)p.start()print('主线程/主进程')# 执行结果如下,p.start ()将开启进程的信号发给操作系统后,操作系统要申请内存空间,让好拷贝父进程地址空间到子进程,开销远大于线程
主线程/主进程
hello

查看PID

"""
在主进程下开启多个线程,每个线程的PID都跟主进程的PID一样
"""
from threading import Thread
import osdef work():print('hello',os.getpid())if __name__ == '__main__':t1=Thread(target=work)t2=Thread(target=work)t1.start()t2.start()print('主线程/主进程pid',os.getpid())# 执行结果:
hello 5760
hello 5760
主线程/主进程pid 5760"""
开启多个进程,每个进程都有不同的PID
"""
from multiprocessing import Process
import osdef work():print('hello',os.getpid())if __name__ == '__main__':p1=Process(target=work)p2=Process(target=work)p1.start()p2.start()print('主线程/主进程',os.getpid())# 执行结果
主线程/主进程 7951
hello 7952
hello 7953

同一进程内的线程共享该进程的数据

"""
进程之间的地址空间是隔离的
"""
from multiprocessing import Process
import osdef work():global nn=0if __name__ == '__main__':n=100p=Process(target=work)p.start()p.join()print('主',n)# 执行结果如下,子进程p已经将自己的全局的n改成了0,但改的仅仅是它自己的,查看父进程的n仍然为100
主 100"""
在同一个进程内开启的多个线程是共享该进程的地址空间的
"""
from threading import Thread
import osdef work():global nn=0if __name__ == '__main__':n=100t=Thread(target=work)t.start()t.join()print('主',n)# 执行结果如下, 查看结果为0,因为同一进程内的线程之间共享进程内的数据
主 0

四 Thread 对象的其他属性和方法

Thread 实例对象的方法:

1 isAlive():返回线程是否活动的
2 getName():返回线程名
3 setName():设置线程名

threading 模块提供的一些方法:

threading.currentThread():返回当前的线程变量
threading.enumerate():返回一个包含正在运行的线程的list,正在运行指线程启动后、结束前,不包括启动前和终止后的线程
threading。activeCount():返回正在运行的线程数量

实例

from threading import Thread
import threading
from multiprocessing import Process
import osdef work():import timetime.sleep(3)print(threading.current_thread().getName())if __name__ == '__main__':#在主进程下开启线程t=Thread(target=work)t.start()print(threading.current_thread().getName())print(threading.current_thread()) #主线程print(threading.enumerate()) #连同主线程在内有两个运行的线程print(threading.active_count())print('主线程/主进程')
"""
执行结果:
MainThread
<_MainThread(MainThread, started 140735268892672)>
[<_MainThread(MainThread, started 140735268892672)>, <Thread(Thread-1, started 123145307557888)>]
主线程/主进程
Thread-1
"""

五 守护线程

无论是进程还是线程,都遵循:守护xxx会等待主xxx运行完毕后被销毁

需要强调的是:运行完毕并非终止运行

1 对主进程来说,主进程在其他代码结束后就已经算运行完毕了(守护进程在此时就被回收),然后主进程会一直等非守护的子进程都运行完毕后回收子进程的资源(否则会产生僵尸进程),才会结束
2 对主线程来说,主线程在其他非守护线程运行完毕后才算运行完毕(守护线程在此时就被回收),因为主线程的结束意味着进程的结束,进程整体的资源都将被回收,而进程必须保证非守护线程都运行完毕后才能结束
from threading import Thread
import time
def sayhi(name):time.sleep(2)print('%s say hello' %name)if __name__ == '__main__':t=Thread(target=sayhi,args=('egon',))t.setDaemon(True) #必须在t.start()之前设置t.start()print('主线程')print(t.is_alive())
"""
执行结果:
主线程
True
"""

六 信号量Semaphore

  信号量也是一把锁,可以指定信号量为5,对比互斥锁同一时间只能有一个任务抢到锁去执行,信号量同一时间可以有5个任务拿到锁去执行,如果说互斥锁是合租房屋的人去抢一个厕所,那么信号量就相当于一群路人争抢公共厕所,公共厕所有多个坑位,这意味着同一时间可以有多个人上公共厕所,但公共厕所容纳的人数是一定的,这便是信号量的大小

from threading import Thread,Semaphore
import threading
import timedef func():sm.acquire()print('%s get sm' %threading.current_thread().getName())time.sleep(3)sm.release()if __name__ == '__main__':sm=Semaphore(5)for i in range(23):t=Thread(target=func)t.start()"""
解析:
Semaphore 管理一个内置的计数器
每当调用 acquire() 时内置计数器 -1
调用 release() 时内置计数器 +1
计数器不能小于0,当计数器为0时,acquire() 将阻塞线程直到其他线程调用 release()
"""

转载于:https://www.cnblogs.com/xuzewen/p/9113391.html

并发编程之多线程操作相关推荐

  1. week6 day4 并发编程之多线程 理论

    week6 day4 并发编程之多线程 理论 一.什么是线程 二.线程的创建开销小 三.线程和进程的区别 四.为何要用多线程 五.多线程的应用举例 六.经典的线程模型(了解) 七.POSIX线程(了解 ...

  2. c+++11并发编程语言,C++11并发编程:多线程std:thread

    原标题:C++11并发编程:多线程std:thread 一:概述 C++11引入了thread类,大大降低了多线程使用的复杂度,原先使用多线程只能用系统的API,无法解决跨平台问题,一套代码平台移植, ...

  3. 安琪拉教百里守约学并发编程之多线程基础

    <安琪拉与面试官二三事>系列文章 一个HashMap能跟面试官扯上半个小时 一个synchronized跟面试官扯了半个小时 <安琪拉教鲁班学算法>系列文章 安琪拉教鲁班学算法 ...

  4. 【Java 并发编程】多线程、线程同步、死锁、线程间通信(生产者消费者模型)、可重入锁、线程池

    并发编程(Concurrent Programming) 进程(Process).线程(Thread).线程的串行 多线程 多线程的原理 多线程的优缺点 Java并发编程 默认线程 开启新线程 `Ru ...

  5. 并发编程(一)多线程基础和原理

    多线程基础 最近,准备回顾下多线程相关的知识体系,顺便在这里做个记录. 并发的发展历史 最早的计算机只能解决简单的数学运算问题,比如正弦. 余弦等.运行方式:程序员首先把程序写到纸上,然后穿 孔成卡片 ...

  6. Java并发编程进阶——多线程的安全与同步

    多线程的安全与同步 多线程的操作原则 多线程 AVO 原则 A:即 Atomic,原子性操作原则.对基本数据类型变量的读和写是保证原子性的,要么都成功,要么都失败,这些操作不可中断. V:即 vola ...

  7. 并发编程(入门) 多线程学习 手写ReentrantLock

    本文学习资料和灵感来自网络,感谢享学课堂13号技师.开课吧小师妹.汪文君老师.<Java并发编程实战>[Brian Goetz] 一:概述 随着java技术的成熟和工作年限的增长,现在出去 ...

  8. python多线程编程模块不包括_python 学习_第四模块 并发编程(多线程)

    python 学习_第四模块 并发编程(多线程) 一  开启线程方式 from threading importThreadimporttimedefsay(name): time.sleep(2)p ...

  9. python并发编程之多线程理论部分

    阅读目录 一 什么是线程 二 线程的创建开销小 三 线程与进程的区别 四 为何要用多线程 五 多线程的应用举例 六 经典的线程模型(了解) 七 POSIX线程(了解) 八 在用户空间实现的线程(了解) ...

最新文章

  1. JavaScript的运行模式
  2. linux 修改时区_如何在 Ubuntu 20.04 上设置或者修改时区
  3. VS2010 ,工程文件减肥
  4. 使用nodejs构建Docker image最佳实践
  5. 没有收到回复的同学注意了,用它一键查询!
  6. Python -- 三元表达式(三目运算符)
  7. Silverlight的自定义tooltip提示工具条
  8. JavaScript——面向对象(封装)
  9. Atiitt 使用java语言编写sql函数或存储过程
  10. 【CSDN】博文导入微信公众号
  11. python 优秀的库推荐
  12. java游戏猿人时代_猿人时代BT版_JAVA游戏免费版下载_7723手机游戏[www.7723.cn]
  13. thymeleaf 基础教程-阅读官方教程(二)
  14. 数学在计算机方面的应用论文参考文献,数学论文参考文献
  15. 叠氮试剂79598-53-1,6-Azidohexanoic Acid,6-叠氮基己酸,末端羧酸可与伯胺基反应
  16. replace和replaceAll的区别
  17. Abaqus安装CAE报错Regview解决方法
  18. MySQL 字段的基本操作:添加、修改和删除字段(详解)
  19. (四)双击放大与缩小图片
  20. c语言关键字大全(32个)

热门文章

  1. How do I select an ITEM from a combobox?
  2. 《Algorithms》Comparable 实现冒泡排序
  3. 数据库内容集锦(持续更新)
  4. 软件设计师19-系统开发和运行02
  5. 白皮书 | 以太坊 (Ethereum ):下一代智能合约和去中心化应用平台
  6. 中国3亿中年男人都在花钱买什么?数据分析后告诉你答案,很现实
  7. 为什么Python是数据科学领域最受欢迎的语言之一?
  8. 拦截器ConnectInterceptor
  9. 量化交易策略matlab交易方案,【策略分享】Matlab量化交易策略源码分享
  10. html写弹出告警状态,基于日志报警插件 elastalert 实现告警(示例代码)