zoukankan      html  css  js  c++  java
  • python中threading的用法

    摘自:http://blog.chinaunix.net/uid-27571599-id-3484048.html

    以及:http://blog.chinaunix.net/uid-11131943-id-2906286.html

    threading提供了一个比thread模块更高层的API来提供线程的并发性。这些线程并发运行并共享内存。 

            下面来看threading模块的具体用法: 

         一、Thread的使用 目标函数可以实例化一个Thread对象,每个Thread对象代表着一个线程,可以通过start()方法,开始运行。

         这里对使用多线程并发,和不适用多线程并发做了一个比较:

    首先是不使用多线程的操作:

    代码如下:

     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/usr/bin/python
    #compare for multi threads
    import time
     
    def worker():
        print "worker"
        time.sleep(1)
        return
     
    if __name__ == "__main__":
        for i in xrange(5):
            worker()

    执行结果如下:

       

    下面是使用多线程并发的操作:

    代码如下:

     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/usr/bin/python
    import threading
    import time
     
    def worker():
        print "worker"
        time.sleep(1)
        return
     
    for i in xrange(5):
        t = threading.Thread(target=worker)
        t.start()

    可以明显看出使用了多线程并发的操作,花费时间要短的很多。

    二、threading.activeCount()的使用,此方法返回当前进程中线程的个数。返回的个数中包含主线程。

    代码如下:

     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #!/usr/bin/python
    #current's number of threads
    import threading
    import time
     
    def worker():
        print "test"
        time.sleep(1)
     
    for i in xrange(5):
        t = threading.Thread(target=worker)
        t.start()
     
    print "current has %d threads" % (threading.activeCount() - 1)

    三、threading.enumerate()的使用。此方法返回当前运行中的Thread对象列表。

    代码如下:

     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    #!/usr/bin/python
    #test the variable threading.enumerate()
    import threading
    import time
     
    def worker():
        print "test"
        time.sleep(2)
     
    threads = []
    for i in xrange(5):
        t = threading.Thread(target=worker)
        threads.append(t)
        t.start()
     
    for item in threading.enumerate():
        print item
     
    print
     
    for item in threads:
        print item

    四、threading.setDaemon()的使用。设置后台进程。

    代码如下:

     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #!/usr/bin/python
    #create a daemon
    import threading
    import time
     
    def worker():
        time.sleep(3)
        print "worker"
     
    t=threading.Thread(target=worker)
    t.setDaemon(True)
    t.start()
    print "haha"

    可以看出worker()方法中的打印操作并没有显示出来,说明已经成为后台进程。

    python线程 threading.Thread 条件变量 同步线程 

    在用python的threading.Thread编写多线程程序时,最简单的就是是用锁,为使线程之间保持同步,可以使用threading.Condition() 条件变量

    思路:

    1.分析哪一块空间需要多线程读写,抽象出一个共享空间类,对共享空间设置读方法(get)和写方法(set)

    2.为使读线程和写线程同步,可以用threading.Condition()产生一个条件,同一个条件有wait()和notify()
    notifyAll()方法,wait使线程自己进入block(阻塞)状态,一个线程的notify可以使同一个条件变量中block
    的线程得到运行的机会。notifyAll通知所有被阻塞的线程进入runnable状态。

    3.所有对共享空间操作的方法(read or write)都封闭在acquire()和release()中间

    ========以下实例简单明了==================

    #coding=utf-8
    #file name is maker.py

    import threading
    import random,time

    class Maker(threading.Thread):
        
        def __init__(self,threadName,shareObject):
            threading.Thread.__init__(self,name=threadName)
            self.shareObject=shareObject
            
        def run(self):
            for x in range(1,5):
                time.sleep(random.randrange(1,4))
                self.shareObject.set(x)
                print "%s threading write %d" %(threading.currentThread().getName(),x)

    =============================================================================


     

    #coding=utf-8
    #file name is user.py

    import threading
    import time,random

    class User(threading.Thread):
        
        def __init__(self,threadName,shareObject):
            threading.Thread.__init__(self,name=threadName)
            self.shareObject=shareObject
            self.sum=0
            
        def run(self):
            for x in range(1,5):
                time.sleep(random.randrange(1,4))
                tempNum=self.shareObject.get()
                print "%s threading read %d" %(threading.currentThread().getName(),tempNum)
                self.sum=self.sum+tempNum
                
        def display(self):
            print "sum is %d" %(self.sum)


     

    =============================================================================

    #coding=utf-8
    #file name is shareInt.py

    import threading
    import time,random

    class ShareInt():
        
        def __init__(self):
            self.threadCondition=threading.Condition()
            self.shareObject=[]
            
            
        #所有对共享空间操作的方法(read or write)都封闭在acquire()和release()中间
        def set(self,num):
            self.threadCondition.acquire() # 在调用一个读或者写共享空间的方法时,需要先拿到一个基本锁
                                                              # 基本锁的获得采用竞争机制,无法判断哪个线程会先运行
                                                      # 不拿基本锁会出现运行时错误:cannot notify on un-aquired lock
            
            if len(self.shareObject)!=0:
                print "%s threading try write! But shareObject is full" %(threading.currentThread().getName())
                self.threadCondition.wait() # 在条件满足的情况下,会block掉调用这个方法的线程
                                   # 这里使用while语句更好,因为block在这个位置后,
                                   # 当再次运行此线程的时候,会从头再一次检查条件。
            
            self.shareObject.append(num)
            
            self.threadCondition.notify() # 一定要先调用notify()方法,在release()释放基本锁
            self.threadCondition.release() # 可以理解为"通知"被wait的线程进入runnable状态,然后在它获得锁后开始运行
                                                              # 最后一定要release()释放锁,否则会导致死锁
                                             
        def get(self):
            self.threadCondition.acquire()
            
            if len(self.shareObject)==0:
                print "%s threading try read! But shareObject is empty" %(threading.currentThread().getName())
                self.threadCondition.wait()
                
            tempNum=self.shareObject[0]
            self.shareObject.remove(tempNum)
            self.threadCondition.notify()
            self.threadCondition.release()
            return tempNum

    ==============================测试代码===============================


     

    #coding=utf-8
    #file name is Test.py

    from user import User
    from maker import Maker
    from shareInt import ShareInt

    shareObject=ShareInt()
    user1=User("user1",shareObject)
    maker1=Maker("maker1",shareObject)

    user1.start()
    maker1.start()

    user1.join()
    maker1.join()

    user1.display()

    print "main threading over!"

     

  • 相关阅读:
    数据库新秀 postgresql vs mongo 性能PK
    mongodb索引--1亿条记录的查询从55.7秒到毫秒级别<补充版>
    nodejs npm install -g 全局安装和非全局安装的区别
    nodejs express template (模版)的使用 (ejs + express)
    CSS3动画:YouTube的红色激光进度条
    IE bug之location.href没有referer
    工程师
    Shadow DOM的事件绑定
    IE回车的一个怪异行为
    CSS3全新的背景图片方案
  • 原文地址:https://www.cnblogs.com/j6-2/p/4645490.html
Copyright © 2011-2022 走看看