<python的线程与threading模块>

一 线程的两种调用方式

threading 模块建立在thread 模块之上。thread模块以低级、原始的方式来处理和控制线程,而threading 模块通过对thread进行二次封装,

提供了更方便的api来处理线程。

直接调用:

 
  1. import threading
  2. import time
  3.  
  4. def sayhi(num): #定义每个线程要运行的函数
  5.  
  6. print("running on number:%s" %num)
  7.  
  8. time.sleep(3)
  9.  
  10. if __name__ == '__main__':
  11.  
  12. t1 = threading.Thread(target=sayhi,args=(1,)) #生成一个线程实例
  13. t2 = threading.Thread(target=sayhi,args=(2,)) #生成另一个线程实例
  14.  
  15. t1.start() #启动线程
  16. t2.start() #启动另一个线程
  17.  
  18. print(t1.getName()) #获取线程名
  19. print(t2.getName())
 

继承式调用:

 
  1. import threading
  2. import time
  3.  
  4. class MyThread(threading.Thread):
  5. def __init__(self,num):
  6. threading.Thread.__init__(self)
  7. self.num = num
  8.  
  9. def run(self):#定义每个线程要运行的函数
  10.  
  11. print("running on number:%s" %self.num)
  12.  
  13. time.sleep(3)
  14.  
  15. if __name__ == '__main__':
  16.  
  17. t1 = MyThread(1)
  18. t2 = MyThread(2)
  19. t1.start()
  20. t2.start()
  21.  
  22. print("ending......")
 

二 threading.thread的实例方法

join&Daemon方法

 
  1. import threading
  2. from time import ctime,sleep
  3. import time
  4.  
  5. def ListenMusic(name):
  6.  
  7. print ("Begin listening to %s. %s" %(name,ctime()))
  8. sleep(3)
  9. print("end listening %s"%ctime())
  10.  
  11. def RecordBlog(title):
  12.  
  13. print ("Begin recording the %s! %s" %(title,ctime()))
  14. sleep(5)
  15. print('end recording %s'%ctime())
  16.  
  17. threads = []
  18.  
  19. t1 = threading.Thread(target=ListenMusic,args=('水手',))
  20. t2 = threading.Thread(target=RecordBlog,args=('python线程',))
  21.  
  22. threads.append(t1)
  23. threads.append(t2)
  24.  
  25. if __name__ == '__main__':
  26.  
  27. for t in threads:
  28. #t.setDaemon(True) #注意:一定在start之前设置
  29. t.start()
  30. # t.join()
  31. # t1.join()
  32. t1.setDaemon(True)
  33.  
  34. #t2.join()########考虑这三种join位置下的结果?
  35. print ("all over %s" %ctime())
 

join():在子线程完成运行之前,这个子线程的父线程将一直被阻塞。

setDaemon(True):

将线程声明为守护线程,必须在start() 方法调用之前设置, 如果不设置为守护线程程序会被无限挂起。这个方法基本和join是相反的。

当我们 在程序运行中,执行一个主线程,如果主线程又创建一个子线程,主线程和子线程 就分兵两路,分别运行,那么当主线程完成

想退出时,会检验子线程是否完成。如 果子线程未完成,则主线程会等待子线程完成后再退出。但是有时候我们需要的是 只要主线程

完成了,不管子线程是否完成,都要和主线程一起退出,这时就可以 用setDaemon方法啦

其它方法

 
  1. # run(): 线程被cpu调度后自动执行线程对象的run方法
  2. # start():启动线程活动。
  3. # isAlive(): 返回线程是否活动的。
  4. # getName(): 返回线程名。
  5. # setName(): 设置线程名。
  6.  
  7. threading模块提供的一些方法:
  8. # threading.currentThread(): 返回当前的线程变量。
  9. # threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。
  10. # threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。
 

三 同步锁(Lock)

 
  1. import time
  2. import threading
  3.  
  4. def addNum():
  5. global num #在每个线程中都获取这个全局变量
  6. #num-=1
  7.  
  8. temp=num
  9. #print('--get num:',num )
  10. time.sleep(0.1)
  11. num =temp-1 #对此公共变量进行-1操作
  12.  
  13. num = 100 #设定一个共享变量
  14. thread_list = []
  15. for i in range(100):
  16. t = threading.Thread(target=addNum)
  17. t.start()
  18. thread_list.append(t)
  19.  
  20. for t in thread_list: #等待所有线程执行完毕
  21. t.join()
  22.  
  23. print('final num:', num )
 

观察:time.sleep(0.1)  /0.001/0.0000001 结果分别是多少?

多个线程都在同时操作同一个共享资源,所以造成了资源破坏,怎么办呢?(join会造成串行,失去所线程的意义)

我们可以通过同步锁来解决这种问题

1
2
3
4
5
6
7
8
9
10
R=threading.Lock()
 
####
def sub():
    global num
    R.acquire()
    temp=num-1
    time.sleep(0.1)
    num=temp
    R.release(

<python的线程与threading模块>的更多相关文章

  1. 简单物联网:外网访问内网路由器下树莓派Flask服务器

    最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...

  2. 利用ssh反向代理以及autossh实现从外网连接内网服务器

    前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...

  3. 外网访问内网Docker容器

    外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...

  4. 外网访问内网SpringBoot

    外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...

  5. 外网访问内网Elasticsearch WEB

    外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...

  6. 怎样从外网访问内网Rails

    外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...

  7. 怎样从外网访问内网Memcached数据库

    外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...

  8. 怎样从外网访问内网CouchDB数据库

    外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...

  9. 怎样从外网访问内网DB2数据库

    外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...

  10. 怎样从外网访问内网OpenLDAP数据库

    外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...

随机推荐

  1. unsigned char idata temp[8];

    unsigned char 是无符号字符,单字节 idata 表示变量位于内部数据区,外部数据区是 xdata,代码区是 codeidata:固定指前面0x00-0xff的256个RAM,其中前128 ...

  2. RabbitMQ中,exchange1绑定exchange2,exchange1和exchange2都绑定queue1,此时消息发送给exchange1,queue1中有几条消息

    如题: 存在两个交换器 exchange1,exchange2 存在一个队列 queue1 存在三个绑定关系:exchange1绑定exchange2 ,exchange1绑定queue1,excha ...

  3. Mybatis Generator主要配置详解

    MyBatis 的代码生成主要配置文档[具体] <?xml version="1.0" encoding="UTF-8"?> <!DOCTYP ...

  4. double 四舍五入保留一定的位数

    /** * double 类型的 四舍五入 保留一定的位数 * @param value * @param decimal 保留的位数 * @return * @throws Exception */ ...

  5. TkbmMWClientQuery的计算字段在CalcFields事件触发次数太多

    kbmmw有两处BUG和作者提下,一个是TkbmMWClientQuery的计算字段在CalcFields事件触发次数太多,另一个是在TkbmMemTable的加载数据时字段会执行OnValidate ...

  6. mac eclipse maven -solved

    最近开始用mac,在开始之初体验到了mac系统的丝滑流畅,但也感受到重新开始学习一个平台的坡度. 最近学习maven,创建项目时总是报错,网上查阅到的资料很少.最后在settings.xml中添加了阿 ...

  7. Python学习第五堂课

    Python学习第五堂课推荐电影:华尔街之狼 被拯救的姜哥 阿甘正传 辛德勒的名单 肖申克的救赎 上帝之城 焦土之城 绝美之城 #上节内容: 变量 if else 注释 # ""& ...

  8. 轻松理解AOP(面向切面编程)

    https://my.oschina.net/yanquan345/blog/203415

  9. 配置DTP

    拓扑一  结果:NO 默认auto(被动)模式 Switch>show interfaces fastEthernet / switchPort Name: Fa0/ Switchport: E ...

  10. 【转】vs2017快捷键大全

    最近接触到.net,用到vs2017,由于以前用的是eclipse,没有用过vs,加上又是日语版的,给工作带来了很多不便,于是网上查了vs2017的快捷键. 项目相关的快捷键 Ctrl + Shift ...