主要学习一下python的多线程编程,使用threading模块,threading 包括:Thread、conditions、event、rlock、semaphore等类。

Thread对象可以实例化一个线程t,在创建t线程时,可以将t的主函数作为一个参数传递进去(target=),或者创建Thread的子类覆盖run方法。在Thread实例化线程t后,t并没有运行,要想让t线程活动,必须启动t,t.start()即可,一旦t是活动的,t将在其主函数结束时结束。在Thread实例化一个线程时必须指定target。

Thread的方法如下:

getname可以返回线程t的名称,setname设置线程t的名称
       isalive 判断一个线程是否是活动的,也就是线程状态在t.start和t.run之间
       isdaemon/setdaemon 如果线程t是一个驻留程序(即使t是活动的,python也可以终止整个处理过程,也会将t结束),isdaemon返回ture,仅当创建t的线程是一个驻留程序时,线程t才是一个驻留程序,这样只能在t.start()之前调用t.setdaemon来设置t为一个驻留程序。
       join 其他调用线程(非t)会直接挂起,直到t结束,只能在t.start之后调用t.join
       run run是运行线程t主函数的方法,thread的子类通常会覆盖run,如果不被覆盖,run将调用在创建t时传递的target参数,通过t.start()调用t.run
       start t.start()让线程t活动

线程同步对象:
      timeout 在event和condition中都有一个可以接收一个可选的timeout参数作为wait方法
      lock/rlock threading的lock和thread的lock一样,rlock是一个重入锁,在r被锁定时,r将跟踪所有者(锁定r的哪个)线程,所有者线程可以再次调用r.acquire而不会出现阻塞,r只是将内部计数器加1。而lock则会永远阻塞。
       condition 创建返回一个condition对象c,c可以包装一个lock或者rlock对象L,acquire/release 这些方法将调用L的对应方法,前提是一个线程拥有对L的锁。notify/notifyall notify可以唤醒正在等待c的线程中的某一个线程,调用线程在调用c.notify()之前必须拥有L,并且notify不会释放L。调用线程通常会在调用notify之后调用release。
       wait wait将释放L,然后挂起调用线程,直到其他线程对c调用notify
       event对象可以让任意数量的线程挂起并等待。

threading模块提供了一个local类,称为TLS,在一个线程中做的任何更改不会对其他线程产生影响

编程代码如下:
#!/usr/bin/python
import sys
import time
import threading
 
b=50
l=threading.Lock()
 
def threadcode():
    global b
    print "Thread %s invoke" % threading.currentThread().getName()
    l.acquire()
    try:
        print "Thread %s is running" % threading.currentThread().getName()
        time.sleep(30)
        b=b+50
        print "Thread %s set b to %d" % (threading.currentThread().getName(),b)
    finally:
        l.release()
 
print "Value of b at start program:",b
 
childthread=[]
for i in range(1,5):
    t=threading.Thread(target=threadcode,name="Thread-%d" % i)
    t.start()
    childthread.append(t)
for i in childthread:
    t.join()
 
print "New value of b:",b
测试图如下:

Python2.7 threading模块学习的更多相关文章

  1. Python2.7 Queue模块学习

    前面了解了一下threading,发现一般都是和queue模块配合使用的,queue产生一个队列,队列模式有3种,针对这三种队列分别有三个构造函数: 1 FIFO队列先进先出:class Queue. ...

  2. python进阶笔记 thread 和 threading模块学习

    Python通过两个标准库thread和threading提供对线程的支持.thread提供了低级别的.原始的线程以及一个简单的锁.threading基于Java的线程模型设计.锁(Lock)和条件变 ...

  3. Python学习笔记- Python threading模块

    Python threading模块 直接调用 # !/usr/bin/env python # -*- coding:utf-8 -*- import threading import time d ...

  4. Python模块学习:threading 多线程控制和处理

    Reference:http://python.jobbole.com/81546/ threading.Thread Thread 是threading模块中最重要的类之一,可以使用它来创建线程.有 ...

  5. Python模块学习------ 多线程threading(2)

    一.避免使用thread模块,使用threading模块的原因: 1. 更高级别的threading模块更为先进,对线程的支持更加完善.而且使用thread模块的属性有可能会与threading 出现 ...

  6. python学习笔记之使用threading模块实现多线程(转)

    综述 Python这门解释性语言也有专门的线程模型,Python虚拟机使用GIL(Global Interpreter Lock,全局解释器锁)来互斥线程对共享资源的访问,但暂时无法利用多处理器的优势 ...

  7. threading模块和queue模块实现程序并发功能和消息队列

    简介: 通过三个例子熟悉一下python threading模块和queue模块实现程序并发功能和消息队列. 说明:以下实验基于python2.6 基本概念 什么是进程? 拥有独立的地址空间,内存,数 ...

  8. python threading基础学习

    # -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' """ python是支持多线程的,并 ...

  9. python 多线程编程之threading模块(Thread类)创建线程的三种方法

    摘录 python核心编程 上节介绍的thread模块,是不支持守护线程的.当主线程退出的时候,所有的子线程都将终止,不管他们是否仍在工作. 本节开始,我们开始介绍python的另外多线程模块thre ...

随机推荐

  1. 【小知识】证明 $1$ 到 $n$ 的立方和公式

    scb 发明了小学奥数(确信) Formula \(\sum\limits_{i=1}^n i^3 = (\sum\limits_{i=1}^n i)^2\) Provement 构造一个矩阵 \(a ...

  2. Python&Selenium借助html-testRunner生成自动化测试报告

    一.摘要 本博文将介绍Python和Selenium进行自动化测试时,借助html-testRunner 生成自动化测试报告 安装命令:pip install html-testRunner 二.测试 ...

  3. ThreadPoolExecutor源码分析一

           在线程池出现之前,每次需要使用线程,都得创建一个线程.但是,在java的运行环境中,创建一个线程是非常耗费资源和时间的.是否可以把线程重复利用,减少线程的创建次数.基于此,java1.5 ...

  4. 关于swap交换操作的新方法

    swap: 在oi中,swap用于交换两个变量的数值. 初学oi时,我们这样操作: 也就是说,需要一个temp变量来寄存x或y的值,因为当一个变量被赋值成为另一个变量时,没有temp它的值会丢失. 貌 ...

  5. Linux命令之nano(简单文本编辑器)

    nano 字符终端文本编辑器 补充说明 nano 是一个字符终端的文本编辑器,有点像DOS下的editor程序.它比vi/vim要简单得多,比较适合Linux初学者使用.某些Linux发行版的默认编辑 ...

  6. barcode模块: plus.barcode.scan 进行扫描图片出现无法识别二维码,打印的错误信息是code:8,message:''

    原因之一:图片的像素太大了,无法识别. 解决方法: 压缩一下图片. 这里的 data 我放了一个  像素为 4040 × 4040 的 图片. 进行识别的时候会报, (无法识别的图片,都是返回这些值) ...

  7. POI做题笔记

    POI2011 Conspiracy (2-SAT) Description \(n\leq 5000\) Solution 发现可拆点然后使用2-SAT做,由于特殊的关系,可以证明每次只能交换两个集 ...

  8. vscode调整字体大小

    在vscode中,通过setting>User>Text Editor>Font可以调整字体大小,但是这里只是调整右侧的代码编辑区域的字体,左侧的侧边栏确无法调整字体大小,找了很久都 ...

  9. lumen 队列处理

    数据库要使用 database 队列驱动,你需要数据表保存任务信息(比如失败任务).要生成创建这些表的迁移,可以在项目目录下运行 Artisan 命令 queue:table,迁移被创建之后,可以使用 ...

  10. yii安装redis扩展(Windows)

    yii安装redis扩展可以用不同的方式, 最简单便捷的是使用 composer 方式, 有的时候composer会出现一些问题(现在还弄不懂),可能是网络什么的原因吧~ 还可以使用手动安装的方式, ...