Chinaunix首页 | 论坛 | 博客
  • 博客访问: 77716
  • 博文数量: 36
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 10
  • 用 户 组: 普通用户
  • 注册时间: 2015-10-08 13:58
文章分类
文章存档

2015年(36)

我的朋友

分类: Python/Ruby

2015-10-08 22:17:09

原文地址:Python【十九】:线程 作者:windhawkgyang

     今天来简单看一下使用Python进行线程编程,由于之前接触过Windows下的进程线程API,而系统下的进程线程机制大多是相通的,因此这里不会过多地再次讲述线程的概念,详细的内容可以参考自己以前的博客:
    线程基础:http://blog.chinaunix.net/uid-26275986-id-3144019.html
     用户模式下的线程同步:http://blog.chinaunix.net/uid-26275986-id-3152738.html
    下面我们直接给出关于Python中使用线程的例子,让大家可以对线程编程有个初步的了解。
一、线程创建

点击(此处)折叠或打开

  1. #This is a test for Threading...
  2. import threading
  3. import time

  4. def Clock_1(interval):
  5.     print 'SubThread is going to work...'
  6.     for i in range(5):
  7.         print 'Clock_1: The SYS Time is ', time.ctime()
  8.         time.sleep(interval)
  9.     print 'SubThread is done...'
  10. if __name__ == '__main__':
  11.     t = threading.Thread(target=Clock_1, args=(3,))
  12.     t.daemon = True
  13.     t.start()
  14.     print t.name, ' has started...'
  15.     #t.join()
  16.     print 'Main Thread will Exit...'
  17.     raw_input('Enter for Exit...')
      Python中关于线程的模块是threading,类似于进程模块multiprocessing,相关的类和方法也都在这个模块中,上面的例子还是使用我们昨天关于系统时间的例子吧!
-1. 第2-3行导入了threading和time模块;
-2. 第5-10行定义了我们的线程函数,主要由新的线程来运行;
-3. 第11行依旧是CMD命令下的功能语句;
-4. 第12行是创建线程的语句,利用threading.Thread()类的构造方法来创建,和Process()一样,不用管其他参数,我们只需要初始化target=Clock_1以及args参数元祖就可以了,返回新线程实例;
-5. t.daemon用来设定该线程是否是后台线程,若为True时则为后台线程,前台线程和后台线程的区别是当主线程退出时子线程是否同步销毁,但是自己在测试的时候,却发现二者结果都是一样的
-6. 第14行是启动该线程的方法,该方法会调用t.run()方法运行target参数指定的函数;
-7. 第16行用于告知主线程等待子线程结束后再结束;

     第一个是没有注释t.daemon=True的运行结果,第二个是注释以后的,可以发现在主线程结束之后,子线程继续运行,所以可以推测进程没有结束,主线程结束之后继续执行子线程。但是也可以看出其中出现了错误,开始的输出信息显示了错乱。我们试着启用t.join()语句,即让主线程等待子线程运行结束再结束:

     可以看出此时主线程没有退出,一直等待子线程结束才退出;

二、同步锁
     线程中一个重要的问题就是资源竞争,为了保证多线程能够协调一致地工作,我们有同步锁、信号量以及事件等多种机制,今天这里只介绍同步锁,其他的机制资料很容易查到,而且只是同一种功能的不同实现,各有利弊。

点击(此处)折叠或打开

  1. #This is a test for Threading...
  2. import threading
  3. import time

  4. def Clock_1(interval):
  5.     lock.acquire()
  6.     print 'SubThread is going to work...'
  7.     for i in range(5):
  8.         print 'Clock_1: The SYS Time is ', time.ctime()
  9.         time.sleep(interval)
  10.     lock.release()
  11.     print 'SubThread is done...'
  12. if __name__ == '__main__':
  13.     lock = threading.Lock()
  14.     t = threading.Thread(target=Clock_1, args=(3,))
  15.     lock.acquire()
  16.     #t.daemon = True
  17.     t.start()
  18.     print t.name, ' has started...'
  19.     lock.release()
  20.     t.join()
  21.     print 'Main Thread will Exit...'
  22.     raw_input('Enter for Exit...')
      上面的代码只是在原来代码的基础上稍微做了一些修改,请注意黑体标识的部分,其实就是同步锁的定义与应用:
-1. lock = threading.Lock()用于初始化一个锁对象;
-2. lock.acquire()用于请求一个锁,如果该锁为空闲,则申请成功,代码继续执行,反之则暂停等待;
-3. lock.release()用于释放一个占用的锁,将其标识为空闲状态;
     就是这么简单,我们看看代码执行的结果,上面部分是原先代码执行的结果,下面代码是加入同步锁之后的运行结果:

      通过比较,我们还是可以看到同步锁规范了线程之间的工作。
阅读(654) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~