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. def run(self):

  6. '''

  7. run 方法

  8. '''

  9. for i in xrange(10):

  10. print self.getName,i

  11. 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. def run(self):

  6. for i in xrange(10):

  7. print self.getName(),i

  8. time.sleep(1)

  9. my = MyThread('test')

  10. 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

初识python多线程相关推荐

  1. 从零开始学 Python 之 初识 Python 多线程

    我们知道,多线程与单线程相比,可以提高 CPU 利用率,加快程序的响应速度. 单线程是按顺序执行的,比如用单线程执行如下操作: 6秒读取文件1 9秒处理文件1 5秒读取文件2 8秒处理文件2 总共用时 ...

  2. python多线程数据交互_python 多线程 通信

    一篇文章搞定Python多进程(全) 公众号:pythonislover 前面写了三篇关于python多线程的文章,大概概况了多线程使用中的方法,文章链接如下: 一篇文章搞懂Python多线程简单实现 ...

  3. 【搬运自用】Python目录及初识Python - 100天从新手到大师Day01(GitHub)

    原作者:骆昊 https://github.com/jackfrued/Python-100-Days 更多内容欢迎查看并订阅专栏'Python从新手到大师' 第一部分目录 Day01~15 - Py ...

  4. 初识python语言

    Introduction to python language 引言 第一节 编程语言分类(Classification of programming languages) 01 机器语言 (Mach ...

  5. Python多线程(3)——Queue模块

    Python多线程(3)--Queue模块 Queue模块支持先进先出(FIFO)队列,支持多线程的访问,包括一个主要的类型(Queue)和两个异常类(exception classes). Pyth ...

  6. python统计csv行数_对Python 多线程统计所有csv文件的行数方法详解

    如下所示: #统计某文件夹下的所有csv文件的行数(多线程) import threading import csv import os class MyThreadLine(threading.Th ...

  7. c++主线程等待子线程结束_简单明了的 Python 多线程来了 | 原力计划

    作者 | 万里羊责编 | 王晓曼出品 | CSDN博客线程和进程计算机的核心是CPU,它承担了所有的计算任务,就像是一座工厂在时刻运行.如果工厂的资源有限,一次只能供一个车间来使用,也就是说当一个车间 ...

  8. python3 多线程_图解|为什么 Python 多线程无法利用多核

    (给Python开发者加星标,提升Python技能) 来源:后端技术指南针 1.全局解释锁 如题: Python的多线程为什么不能利用多核处理器? 全局解释器锁(Global Interpreter ...

  9. python多线程下的信号处理程序示例

    下面是一个网上转载的实现思路,经过验证,发现是可行的,就记录下来. 思路 python多线程中要响应Ctrl+C的信号以杀死整个进程,需要: 1.把所有子线程设为Daemon: 2.使用isAlive ...

最新文章

  1. 【Socket网络编程】1.bind()和 INADDR_ANY 解析
  2. 设计模式之单例模式(C++代码实现)
  3. CH2401 送礼物(双向dfs)
  4. 史密斯预估器matlab仿真,(毕业论文)史密斯预估器设计.doc
  5. selenium-webdriver——如何在启动firefox时加载扩展
  6. 管理感悟:软件第一法则
  7. 循环神经网络(RNN)详解
  8. 微信小程序双击底部导航栏刷新页面
  9. 2109-全国大学生电子设计竞赛-F-纸张数识别(内含arduino代码以及题解)
  10. TCP/IP重传超时--RTO - SRTT (Smoothed Round Trip Time)
  11. 应用层故事难讲 公链集体押注DeFi背后 是黔驴技穷的无奈之举?
  12. 职业生涯规划书-前端
  13. OA项目之会议排座和送审
  14. XCTF攻防世界WEB新手区题目writeup
  15. 不能学习vlan的解决
  16. 为什么从此电脑访问不了ftp_蓝奏云网盘为什么访问不了?(附资源)
  17. SQLServer中使用between查询日期
  18. kurento和打洞的服务器的安装及部署
  19. 微信小程中文特殊字符编码与解码
  20. 【杂谈】她养花10年从来没买过花盆,简单几招,废物变盆栽!

热门文章

  1. java解析vue对象数组,Java数组
  2. python内置函数面向对象_Pyhton——面向对象进阶二:类的内置函数补充、描述符...
  3. 无法删除所有指定的值_AutoCAD所有系统变量大全
  4. 有没有检查c语言编译错误的软件,求大佬解答,为什么这个程序编译软件检查不出错误...
  5. php表单验证内容不能为空,php校验表单检测字段是否为空的方法_PHP教程
  6. AndroidJava try-catch-finally正确用法
  7. Android接口一般定义格式,Android开发规范
  8. html 使用百度搜索,百度搜索uzer,进入主页
  9. mysql+distinct+max_MySQL中distinct与group by之间的性能进行比较
  10. (二叉树的遍历)Tree UVa 548