初识python多线程

1) 在python中如何创建一个线程对象?

如果你要创建一个线程对象,很简单,只要你的类继承threading.Thread,然后在__init__里首先调用threading.Thread的__init__方法即可:

 
  1. import threading

  2. class MyThread(threading.Thread):

  3. def __init__(self,threadname):

  4. threading.Thread.__init__(self,name=threadname)

这才仅仅是个空线程,我可不是要他拉空车的,他可得给我干点实在活。很简单,重写类的run()方法即可,把你要在线程执行时做的事情都放到里面

 
  1. import threading,time

  2. class MyThread(threading.Thread):

  3. def __init__(self,threadname):

  4. threading.Thread.__init__(self,name=threadname)

  5.  
  6. def run(self):

  7.  
  8. '''

  9.  
  10. run 方法

  11.  
  12. '''

  13. for i in xrange(10):

  14. print self.getName,i

  15. time.sleep(1)

以上代码如果被执行之后会每隔1秒输出一次信息到屏幕,10次后结束。其中这里getName()是threading.Thread类的一个方法,用来获得这个线程对象的name。还有一个方法setName()当然就是来设置这个线程对象的name的了。

 

如果要创建一个线程,首先就要先创建一个线程对象

my = MyThread('test')

一个线程对象被创建后,他就处于“born”(诞生状态),如何让这个线程对象开始运行呢?只要调用线程对象的start()方法即可

 
  1. import threading,time

  2. class MyThread(threading.Thread):

  3. def __init__(self,threadname):

  4. threading.Thread.__init__(self,name=threadname)

  5.  
  6. def run(self):

  7. for i in xrange(10):

  8. print self.getName(),i

  9. time.sleep(1)

  10.  
  11. my = MyThread('test')

  12. my.start()

现在线程就处于“ready”状态或者也称为“runnable”状态。

奇怪吗?不是已经start了吗?为什么不称为“running”状态呢?其实是有原因的。因为我们的计算机一般是不具有真正并行处理能力的。我们所谓的多线程只是把时间分成片段,然后隔一个时间段就让一个线程执行一下,然后进入“sleeping ”状态,然后唤醒另一个在“sleeping”的线程,如此循环runnable->sleeping->runnable... ,只是因为计算机执行速度很快,而时间片段间隔很小,我们感受不到,以为是同时进行的。所以说一个线程在start了之后只是处在了可以运行的状态,他什么时候运行还是由系统来进行调度的。

那一个线程什么时候会“dead”呢?一般来说当线程对象的run方法执行结束或者在执行中抛出异常的话,那么这个线程就会结束了。系统会自动对“dead”状态线程进行清理。

 

如果一个线程A在执行的过程中需要等待另一个线程tB执行结束后才能运行的话,那就可以在A在调用B的B.join()方法,另外还可以给join()传入等待的时间。

 

线程对象的setDaemon()方法可以让子线程随着主线程的退出而结束,不过注意的是setDaemon()方法必须在线程对象没有调用start()方法之前调用(默认情况下;在python中,主线程结束后,会默认等待子线程结束后,主线程才退出)。

 
  1. t1 = MyThread('t1')

  2. print t1.getName(),t1.isDaemon()

  3. t1.setDaemon(True)

  4. print t1.getName(),t1.isDaemon()

  5. t1.start()

  6. print 'main thread exit'

 

当执行到 print 'main thread exit' 后,主线程就退出了,当然t1这个线程也跟着结束了。但是如果不使用t1线程对象的setDaemon()方法的话,即便主线程结束了,还要等待t1线程自己结束才能退出进程。isDaemon()是用来获得一个线程对象的Daemonflag状态的

 

如何来获得与线程有关的信息呢?


获得当前正在运行的线程的引用

running = threading.currentThread()

获得当前所有活动对象(即run方法开始但是未终止的任何线程)的一个列表

threadlist = threading.enumerate()

获得这个列表的长度

threadcount = threading.activeCount()

查看一个线程对象的状态调用这个线程对象的isAlive()方法,返回1代表处于“runnable”状态且没有“dead”

threadflag = threading.isAlive()

 

 

2)  线程同歩队列?

     我们经常会采用生产者/消费者关系的两个线程来处理一个共享缓冲区的数据。例如一个生产者线程接受用户数据放入一个共享缓冲区里,等待一个消费者线程对数据 取出处理。但是如果缓冲区的太小而生产者和消费者两个异步线程的速度不同时,容易出现一个线程等待另一个情况。为了尽可能的缩短共享资源并以相同速度工作 的各线程的等待时间,我们可以使用一个“队列”来提供额外的缓冲区。

 

      创建一个“队列”对象

 
  1. import Queue

  2. myqueue = Queue.Queue(maxsize = 10)


Queue.Queue类即是一个队列的同步实现。队列长度可为无限或者有限。可通过Queue的构造函数的可选参数maxsize来设定队列长度。如果maxsize小于1就表示队列长度无限。

 

将一个值放入队列中

myqueue.put(10)

调用队列对象的put()方法在队尾插入一个项目。put()有两个参数,第一个item为必需的,为插入项目的值;第二个block为可选参数,默认为1。如果队列当前为空且block为1,put()方法就使调用线程暂停,直到空出一个数据单元。如果block为0,put方法将引发Full异常。

 

将一个值从队列中取出

myqueue.get()

调用队列对象的get()方法从队头删除并返回一个项目。可选参数为block,默认为1。如果队列为空且block为1,get()就使调用线程暂停,直至有项目可用。如果block为0,队列将引发Empty异常。

另外:   q.task_done():表示q.get()返回的项目已被处理; q.join():表示直到队列中所有项目均被处理。

参考自https://blog.csdn.net/a921800467b/article/details/8579915

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

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

相关文章

Fiddler抓包工具之Filters(过滤器)进行会话过滤

一、设置User Fiters启用 未勾选Use Filters,未启用此功能;已勾选Use Filters,已启用此功能 二、Action设置 Run Filterset now :马上执行过滤,立即生效过滤 Load Filterset: 加载本地过滤文件到fiddler Save Filt…

【pyQT5】Python3+pyQT5开发环境安装与配置

在PyQt中编写UI界面可以直接通过代码来实现,也可以通过Qt Designer来完成。Qt Designer的设计符合MVC的架构,其实现了视图和逻辑的分离,从而实现了开发的便捷。 Qt Designer中的操作方式十分灵活,其通过拖拽的方式放置控件可以随时…

C++运行界面一闪而过解决

#include<iostream> #include <stdlib.h> #切记导入这个头文件 using namespace std;int main() { cout << "Hello Word"<<endl; system("pause"); #让界面不是一闪而过 return 0; } 注意&#xff1a;VS2012以上版本才支持C 11…

【TensorFlow】TensorFlow是什么?

TensorFlow 是一个开源的、基于 Python 的机器学习框架&#xff0c;它由 Google 开发&#xff0c;并在图形分类、音频处理、推荐系统和自然语言处理等场景下有着丰富的应用&#xff0c;是目前最热门的机器学习框架。 除了Python&#xff0c;TensorFlow 也提供了 C/C、Java、Go、…

TPS、QPS、系统吞吐量、并发用户数区别及性能术语的理解

一、QPS/TPS QPS&#xff1a;Queries Per Second意思是“每秒查询率”&#xff0c;是一台服务器每秒能够相应的查询次数&#xff0c;是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。 TPS&#xff1a;是TransactionsPerSecond的缩写&#xff0c;也就是事务数/…

js设置了location.href不跳转问题

今天碰到一个问题&#xff0c;用JS设置了location.href就是不跳转的问题。代码如下&#xff1a; $(‘#gofriendtab’).on(‘click’, function() { location.href “XXXXX”; }) 测试运行了一下&#xff0c;发现确实执行了这个代码&#xff0c;但是…

【TensorFlow】Win7+Anaconda+python3.6+Tensorflow1.9安装教程

相关链接 官网&#xff1a;https://tensorflow.google.cn/ github&#xff1a;https://github.com/tensorflow/tensorflow 中文社区网&#xff1a;http://www.tensorfly.cn/ 安装说明 平台&#xff1a;windows 7 Anaconda版本&#xff1a;4.6.14 python版本&#xff1a;3.6.…

【Jmeter篇】如何利用Jmeter配置元件计数器、随机变量制造批量数据和变量参数化?

一、计数器 1、线程组-配置元件-计数器 2、功能介绍 starting value&#xff1a;给定计数器的起始值、初始值&#xff0c;第一次迭代时&#xff0c;会把该值赋给计数器 递增(Increment)&#xff1a; 每次迭代后&#xff0c;给计数器增加的值 最大值(Maximum) &#xff1a;…

echarts自适应父div大小

百度了n种办法&#xff0c;试了n种办法后终于测出来了。 方法一&#xff1a;window.οnresizemyChart.resize; 但是没有效果 方法二&#xff1a; window.addEventListener("resize", function () { myChart.resize(); }); 依旧没有效果 方法三&#xff1a; &l…

软件工程经济学习题 答案(不保证对错,找不到答案)

一、资金等值计算 1.某IT企业今年向银行贷款20万元以购置一台设备。若银行贷款利率为10%&#xff0c;规定10年内等额偿还&#xff0c;试求每年的偿还金额。 2.某软件企业向银行贷款200万元&#xff0c;按年利率为8%进行复利计息&#xff0c;试求该企业第5年末连本带利一次偿还银…

【数据库】Mysql日期/时间相关函数汇总

当我们处理日期时&#xff0c;最难的任务恐怕是确保所插入的日期的格式&#xff0c;与数据库中日期列的格式相匹配。 只要数据包含的只是日期部分&#xff0c;运行查询就不会出问题。但是&#xff0c;如果涉及时间&#xff0c;情况就有点复杂了。 在讨论日期查询的复杂性之前&a…

【测试方法篇】效率测试

一、操作数据库 1、测试页面数据翻页功能&#xff0c;使用insert插入多条数据&#xff0c;测试完成后&#xff0c;再删除插入的数据 2、订单表order&#xff0c;订单状态字段status 1新订单 2已提交订单 3已付款订单 4已发货订单 5已完成订单 已付款列表页&#xff0c;只…

Django+Jquery+Ajax+验证码登录案例

1&#xff0c;创建项目test04 2&#xff0c;创建应用app为booktest 3&#xff0c;注册应用booktest 作用让创建的应用运行起来 4&#xff0c;在项目根目录下创建模板templates目录 作用就是存放html文件在项目的settings.py文件中配置模板&#xff0c;如下图&#xff1a;5&…

【数据库】Mysql日期/时间函数实际案例

有一款金融产品&#xff0c;总共24期&#xff0c;每月2日到期还款日&#xff0c;第一个到期还款日为放款日下个月的2日&#xff0c;现在我们知道所有订单的放款时间&#xff0c;现在我们想统计每个订单当前时间是第几期。 举个简单例子&#xff1a;当期日期为2019-11-12&#…

【Jmeter篇】1小时轻松搞定项目接口自动化测试与数据驱动

之前我们的用例数据都是配置在 Jmeter Http 请求中&#xff0c;每次需要增加&#xff0c;修改用例都需要打开 jmeter 重新编辑&#xff0c;当用例越来越多的时候&#xff0c;用例维护起来就越来越麻烦&#xff0c;有没有好的方法来解决这种情况呢&#xff1f; 其实我们可以将用…

module 'queue' has no attribute 'Queue'解决

import queue q queue.Queue() q.put(a) q.put(b) print(q.get())错误&#xff1a; AttributeError: module queue has no attribute Queue 解决方法&#xff1a; 把程序名命名和包名一样导致错误。命名为queue1.py就ok了

【Python】import自己的模块报错

在实际使用python时&#xff0c;我们会将一些公共的东西写到一些基础模块中&#xff0c;供其他模块去调用&#xff0c;这时会去import自定义的一些基础模块&#xff0c;然后来导入。 自己写好了脚本&#xff0c;然后导入&#xff0c;导入的情况分为以下情况&#xff1a; 1. 运行…

Jmeter生成自动化和性能多维度测试报告(性能指标和监听器图表)

jmeter在命令行下还可以生成多维度的测试报告&#xff0c;里面包含了常用的性能指标和监听器图表。 一、环境要求 1、jmeter3.0版本之后开始支持动态生成测试报表 2、jdk版本1.7以上 3、需要jmx脚本文件 二、生成jtl文件 1、进入bin目录下cd jmeter -n -t C:\jmeter\apach…

python3判断字典、列表、元组为空以及字典是否存在某个key的方法

m1[] m2{} m3() m4{"name":1,"age":2} #也可用if not m1:print("m1不是列表") if m1:print("m1不是列表") else:print(m1)print("m1是空列表")if m2:print("m2不是字典") else:print("m2是空字典") if …

【Python】pyinstaller模块打包的exe在windows环境无法使用问题汇总

问题一&#xff1a;解决pyinstaller打包发布后的exe文件打开控制台闪退的问题 pyinstaller打包发布后的exe文件在自己电脑能够正常使用&#xff0c;但是给到别人的电脑时&#xff0c;打开exe文件却发生闪退&#xff0c;看不到具体的原因。 1、定位问题&#xff1a; 1.1.切换到…