[python]多线程模块thread与threading

Python通过两个标准库(thread, threading)提供了对多线程的支持

thread模块

import time
import thread  

def runner(arg):
    for i in range(6):
        print str(i)+‘:‘+arg  

        time.sleep(1)
    #结束当前线程
    thread.exit_thread()  #等同于thread.exit()  

#启动一个线程,第一个参数为函数名,
#第二个参数为一个tuple类型,是传给函数的参数
thread.start_new_thread(runner, (‘hello world‘,))   #等同于thread.start_new(runner, (‘hello world‘))  

#创建一个锁,锁用于线程同步,通常控制对共享资源的访问
lock = thread.allocate_lock()  #等同于thread.allocate()
num = 0
#获得锁,成功返回True,失败返回False
if lock.acquire():
    num += 1
    #释放锁
    lock.release()
#thread模块提供的线程都将在主线程结束后同时结束,因此将主线程延迟结束
time.sleep(10)
print ‘num:‘+str(num)  

threading.Thread类的常用方法

1.在自己的线程类的__ init__里调用threading.Thread.__init__(self,name=threadname)threadname为线程的名字。
2.run(),通常需要重写,编写代码实现做需要的功能。
3.getName(),获得线程对象名称。
4.setName(),设置线程对象名称。
5.start(),启动线程。
6.join([timeout]),等待另一线程结束后再运行。
7.setDaemon(bool),设置子线程是否随主线程一起结束,必须在start()之前调用。默认为False。
8.isDaemon(),判断线程是否随主线程一起结束。
9.isAlive(),检查线程是否在运行中。

要想创建一个线程对象,只要继承类threading.Thread,然后在__ init__里边调用threading.Thread.__init__()方法即可。重写run()方法,将要实现的功能放到此方法中即可。

class runner(threading.Thread):
    def __init__(self, name):
        threading.Thread.__init__(self)
        self.name = name
        self.thread_stop = False
    def run(self):
        while not self.thread_stop:
            print str(self.name)+‘:‘+‘hello world‘
            time.sleep(1)
    def stop(self):
        self.thread_stop = True  

def test():
    t = runner(‘thread‘)
    t.start()
    time.sleep(10)
    t.stop()  

if __name__ == ‘__main__‘:
    test()  

线程同步(锁)

最简单的同步机制就是锁。锁对象由threading.RLock类创建。线程可以使用锁的acquire()方法获得锁,这样锁就进入locked状态。每次只有一个线程可以获得锁。如果当另一个线程试图获得这个锁的时候,就会被系统变为blocked状态,直到那个拥有锁的线程调用锁的release()方法来释放锁,这样锁就会进入unlocked状态。blocked状态的线程就会收到一个通知,并有权利获得锁。

如果多个线程处于blocked状态,所有线程都会先解除blocked状态,然后系统选择一个线程来获得锁,其他的线程继续blocked。python的threading module是在建立在thread module基础之上的一个module,在thread module中,python提供了用户级的线程同步工具Lock对象。

而在threading module中,python又提供了Lock对象的变种: RLock对象。RLock对象内部维护着一个Lock对象,它是一种可重入的对象。对于Lock对象而言,如果一个线程连续两次进行acquire操作,那么由于第一次acquire之后没有release,第二次acquire将挂起线程。这会导致Lock对象永远不会release,使得线程死锁。

RLock对象允许一个线程多次对其进行acquire操作,因为在其内部通过一个counter变量维护着线程acquire的次数。而且每一次的acquire操作必须有一个release操作与之对应,在所有的release操作完成之后,别的线程才能申请该RLock对象。

我们把修改共享数据的代码称为临界区。必须将所有临界区都封闭在同一个锁对象的acquirerelease之间。

import time
import threading
num=0
lock = threading.RLock()
class runner(threading.Thread):
    def __init__(self, name):
        threading.Thread.__init__(self)
        self.name = name  

    def run(self):
        global num
        while True:
            if num >= 6: break
            if lock.acquire():
                print "Thread(%s) locked, Number: %d" % (self.name, num)
                time.sleep(1)
            lock.release()
            print "Thread(%s) released, Number: %d" % (self.name, num)
            time.sleep(1)
            num += 1   

def test():
    t1 = runner(‘thread1‘)
    t2 = runner(‘thread2‘)
    t1.start()
    t2.start()  

if __name__== ‘__main__‘:
    test()    

Python thread实现多线程

#-*- encoding: gb2312 -*-
import string, threading, time

def thread_main(a):
  global count, mutex
  # 获得线程名
  threadname = threading.currentThread().getName()

  for x in xrange(0, int(a)):
    # 取得锁
    mutex.acquire()
    count = count + 1
    # 释放锁
    mutex.release()
    print threadname, x, count
    time.sleep(1)

def main(num):
  global count, mutex
  threads = []

  count = 1
  # 创建一个锁
  mutex = threading.Lock()
  # 先创建线程对象
  for x in xrange(0, num):
    threads.append(threading.Thread(target=thread_main, args=(10,)))
  # 启动所有线程
  for t in threads:
    t.start()
  # 主线程中等待所有子线程退出
  for t in threads:
    t.join() 

if __name__ == ‘__main__‘:
  num = 4
  # 创建4个线程
  main(4)

Python threading实现多线程

#-*- encoding: gb2312 -*-
import threading
import time

class Test(threading.Thread):
  def __init__(self, num):
    threading.Thread.__init__(self)
    self._run_num = num

  def run(self):
    global count, mutex
    threadname = threading.currentThread().getName()

    for x in xrange(0, int(self._run_num)):
      mutex.acquire()
      count = count + 1
      mutex.release()
      print threadname, x, count
      time.sleep(1)

if __name__ == ‘__main__‘:
  global count, mutex
  threads = []
  num = 4
  count = 1
  # 创建锁
  mutex = threading.Lock()
  # 创建线程对象
  for x in xrange(0, num):
    threads.append(Test(10))
  # 启动线程
  for t in threads:
    t.start()
  # 等待子线程结束
  for t in threads:
    t.join() 
时间: 2024-08-28 18:11:57

[python]多线程模块thread与threading的相关文章

python多线程模块thread使用范例的代码

下边内容是关于python多线程模块thread使用范例的内容,希望能对小伙伴们也有用处. #!/usr/bin/python import threadimport time # Define a function for the threaddef print_time( threadName, delay): count = 0 while count < 5: time.sleep(delay) count += 1 print "%s: %s" % ( threadNa

Python多线程模块

引言 thread threading 1 Thread 11 下面使用threading模块实现与上面相同的功能 12 在创建新线程时还可以给Thread传递可调用类的对象这样使用类本身来保存信息 如 13 从Thread派生一个子类然后创建这个子类的实例 14 实例 Queue 0. 引言 在Python中可使用的多线程模块主要有两个,thread和threading模块.thread模块提供了基本的线程和锁的支持,建议新手不要使用.threading模块允许创建和管理线程,提供了更多的同步

PYTHON——多线程:Thread类与线程函数

Thread类与线程函数 可以使用Thread对象的join方法等待线程执行完毕:主线程(main()函数)中调用Thread对象的join方法,并且Thread对象的线程函数没有执行完毕,主线程会处于阻塞状态.使用Thread类实现多线程的步骤:1.创建Thread类的实例:2.通过Thread类的构造方法的target关键字参数执行线程函数:通过args关键字参数指定传给线程函数的参数.3.调用Thread对象的start方法启动线程.下面例子功能:使用Thread对象启动2个线程,并在各自

PYTHON——多线程:Thread类与线程对象

Thread类与线程对象 Thread类构造方法的target关键字参数不仅可以是函数,还可以是一个对象,可以称这个对象为线程对象.其实,线程调用的仍然是函数,只是这个函数用对象进行了封装.这么做的好处是可以将线程函数相关的代码都放在这个对象对应的类中,更能体现面向对象的封装性. 线程对象对应的类需要有一个可以传入线程函数和参数的构造方法,而且在类中还必须有一个名为"__call__()"的方法.当线程启动时,会自动调用线程对象的"__call__()"方法,然后在

Python多线程编程详解

Threading模块从Python 1.5.2 版开始出现,用于增强底层的多线程模块 thread .Threading 模块让操作多线程变得更简单,并且支持程序同时运行多个操作. 注意, Python开发中的多线程最好用于处理有关 I/O 的操作 ,如从网上下载资源或者从本地读取文件或者目录.如果你要做的是 CPU 密集型操作,那么你需要使用 Python 的 multiprocessing 模块.这样做的原因是,Python 有一个全局解释器锁 (GIL),使得所有子线程都必须运行在同一个

python threading模块使用 以及python多线程操作的实践(使用Queue队列模块)

今天花了近乎一天的时间研究python关于多线程的问题,查看了大量源码 自己也实践了一个生产消费者模型,所以把一天的收获总结一下. 由于GIL(Global Interpreter Lock)锁的关系,纯的python代码处理一般逻辑的确无法活动性能上的极大提升,但是在处理需要等待外部资源返回或多用户的应用程序中,多线程仍然可以作为一个比较好的工具来进行使用. python提供了两个模块thread和threading 来支持python的多线程操作.通俗的讲一般现在我们只使用threading

Python 多线程 -thread threading Queue- 简单学习

在实际工作过程中,会出现需要并发的做一些事情,例如一台机器测到几千台机器的网络连通性,如果你单线程一台一台测的话,会花费很多的事情,不具有实时性,更不能在变化的时候立刻感知当时网络的状况,这时多线程就是一个很好地选择.python已经给我们封装好了多线程库thread和threading. thread:比较底层的模块 threading:Higher-level threading interface ps:建议使用threading模块 - 高级别的threading模块更为先进,对线程的支

Python多线程(threading)学习总结

注:此文除了例子和使用心得是自己写的,很多都是Python核心编程中的原文.原文文风应该能看出来,就不每个地方单独表明出处了. 线程(有时被称为轻量级进程)跟进程有些相似,不同的是,所有的线程运行在同一个进程中,共享相同的运行环境.它们可以想像成是在主进程或"主线程"中并行运行的"迷你进程". 线程有开始,顺序执行和结束三部分.它有一个自己的指令指针,记录自己运行到什么地方.线程的运行可能被抢占(中断),或暂时的被挂起(也叫睡眠),让其它的线程运行,这叫做让步.一个

Python多线程,多进程,并行,并发,异步编程

Python并发与并行的新手指南:http://python.jobbole.com/81260/ Python 中的多线程,多进程,并发,并行,同步,通信:https://blog.csdn.net/timemachine119/article/details/54091323 python进阶笔记 thread 和 threading模块学习:https://www.cnblogs.com/forward-wang/p/5970640.html Python 中的多线程,多进程,并发,并行,