python可以方便地支持多线程。可以快速创建线程、互斥锁、信号量等等元素,支持线程读写同步互斥。美中不足的是,python的运行在python 虚拟机上,创建的多线程可能是虚拟的线程,需要由python虚拟机来轮询调度,这大大降低了python多线程的可用性。我们经今天用了经典的生产者和消费者的问题来说明下python的多线程的运用 上代码:

#encoding=utf-8
import threading
import random
import time
from Queue import Queue

class Producer(threading.Thread):

   def __init__(self, threadname, queue):
       threading.Thread.__init__(self, name = threadname)
       self.sharedata = queue

   def run(self):
       for i in range(20):
           print self.getName(),'adding',i,'to queue'
           self.sharedata.put(i)
           time.sleep(random.randrange(10)/10.0)
       print self.getName(),'Finished'


class Consumer(threading.Thread):

   def __init__(self, threadname, queue):
       threading.Thread.__init__(self, name = threadname)
       self.sharedata = queue

   def run(self):

       for i in range(20):
           print self.getName(),'got a value:',self.sharedata.get()
           time.sleep(random.randrange(10)/10.0)
       print self.getName(),'Finished'

# Main thread
def main():

   queue = Queue()
   producer = Producer('Producer', queue)
   consumer = Consumer('Consumer', queue)
   print 'Starting threads ...'
   producer.start()
   consumer.start()
   producer.join()
   consumer.join()
   print 'All threads have terminated.'

if __name__ == '__main__':
   main()

上面的例子引出了多线程编程的最常见问题:数据共享,python线程池或者说是python线程通信。当多个线程都修改某一个共享数据的时候,需要进行同步控制。

线程同步能够保证多个线程安全访问竞争资源,最简单的同步机制是引入互斥锁。python线程锁为资源引入一个状态:锁定/非锁定。某个线程要更改共享数据时,先将其锁定,此时资源的状态为“锁定”,其他线程不能更改;直到该线程释放资源,将资源的状态变成“非锁定”,其他的线程才能再次锁定该资源。互斥锁保证了每次只有一个线程进行写入操作,从而保证了多线程情况下数据的正确性。

threading模块中定义了Lock类,可以方便的处理锁定:

#创建锁
mutex = threading.Lock()
#锁定
mutex.acquire([timeout])
#释放
mutex.release()

其中,锁定方法acquire可以有一个超时时间的可选参数timeout。如果设定了timeout,则在超时后通过返回值可以判断是否得到了锁,从而可以进行一些其他的处理。

理解好上面的代码。推荐你看下python cookielib,以后用python urllib 写一个多线程下载网页的脚本应该没什么问题了


python视频教程

相关文章: