设为首页 收藏本站
查看: 1129|回复: 0

[经验分享] Python模块学习 ---- thread 多线程处理

[复制链接]

尚未签到

发表于 2015-10-26 12:30:31 | 显示全部楼层 |阅读模式
  http://blog.iyunv.com/JGood/article/details/4299476

  
  这段时间一直在用 Python 写一个游戏的服务器程序。在编写过程中,不可避免的要用多线程来处理与客户端的交互。 Python 标准库提供了 thread 和 threading 两个模块来对多线程进行支持。其中, thread 模块以低级、原始的方式来处理和控制线程,而 threading 模块通过对 thread 进行二次封装,提供了更方便的 api 来处理线程。 虽然使用 thread 没有 threading 来的方便,但它更灵活。今天先介绍 thread 模块的基本使用,下一篇将介绍threading 模块。
  在介绍 thread 之前,先看一段代码,猜猜程序运行完成之后,在控制台上输出的结果是什么?
  
[python] view plaincopy

  • #coding=gbk
  • import thread, time, random
  • count = 0
  • def threadTest():
  •     global count
  •     for i in xrange(10000):
  •         count += 1
  • for i in range(10):
  •     thread.start_new_thread(threadTest, ()) #如果对start_new_thread函数不是很了解,不要着急,马上就会讲解
  • time.sleep(3)
  • print count #count是多少呢?是10000 * 10 吗?
thread.start_new_thread ( function, args [ , kwargs ] )
  函数将创建一个新的线程,并返回该线程的标识符(标识符为整数)。参数 function 表示线程创建之后,立即执行的函数,参数 args 是该函数的参数,它是一个元组类型;第二个参数 kwargs 是可选的,它为函数提供了命名参数字典。函数执行完毕之后,线程将自动退出。如果函数在执行过程中遇到未处理的异常,该线程将退出,但不会影响其他线程的执行。 下面是一个简单的例子:
  
[python] view plaincopy

  • #coding=gbk
  • import thread, time
  • def threadFunc(a = None, b = None, c = None, d = None):
  •     print time.strftime('%H:%M:%S', time.localtime()), a
  •     time.sleep(1)
  •     print time.strftime('%H:%M:%S', time.localtime()), b
  •     time.sleep(1)
  •     print time.strftime('%H:%M:%S', time.localtime()), c
  •     time.sleep(1)
  •     print time.strftime('%H:%M:%S', time.localtime()), d
  •     time.sleep(1)
  •     print time.strftime('%H:%M:%S', time.localtime()), 'over'

  • thread.start_new_thread(threadFunc, (3, 4, 5, 6))   #创建线程,并执行threadFunc函数。
  • time.sleep(5)
thread.exit ()
  结束当前线程。调用该函数会触发 SystemExit 异常,如果没有处理该异常,线程将结束。   
thread.get_ident ()
  返回当前线程的标识符,标识符是一个非零整数。
thread.interrupt_main ()
  在主线程中触发 KeyboardInterrupt 异常。子线程可以使用该方法来中断主线程。下面的例子演示了在子线程中调用 interrupt_main ,在主线程中捕获异常 :
  
[python] view plaincopy

  • import thread, time
  • thread.start_new_thread(lambda : (thread.interrupt_main(), ), ())
  • try:
  •     time.sleep(2)
  • except KeyboardInterrupt, e:
  •     print 'error:', e
  • print 'over'
  
  下面介绍 thread 模块中的琐,琐可以保证在任何时刻,最多只有一个线程可以访问共享资源。
  thread.LockType 是 thread 模块中定义的琐类型。它有如下方法:
lock.acquire ( [ waitflag ] )
  获取琐。函数返回一个布尔值,如果获取成功,返回 True ,否则返回 False 。参数 waitflag 的默认值是一个非零整数,表示如果琐已经被其他线程占用,那么当前线程将一直等待,只到其他线程释放,然后获取访琐。如果将参数 waitflag 置为 0 ,那么当前线程会尝试获取琐,不管琐是否被其他线程占用,当前线程都不会等待。
lock.release ()
  释放所占用的琐。
lock.locked ()
  判断琐是否被占用。
  现在我们回过头来看文章开始处给出的那段代码:代码中定义了一个函数 threadTest ,它将全局变量逐一的增加 10000 ,然后在主线程中开启了 10 个子线程来调用 threadTest 函数。但结果并不是预料中的 10000 * 10 ,原因主要是对 count 的并发操作引来的。全局变量 count 是共享资源,对它的操作应该串行的进行。下面对那段代码进行修改,在对 count 操作的时候,进行加琐处理。看看程序运行的结果是否和预期一致。修改后的代码:
  
[python] view plaincopy

  • #coding=gbk
  • import thread, time, random
  • count = 0
  • lock = thread.allocate_lock() #创建一个琐对象
  • def threadTest():
  •     global count, lock
  •     lock.acquire() #获取琐

  •     for i in xrange(10000):
  •         count += 1

  •     lock.release() #释放琐
  • for i in xrange(10):
  •     thread.start_new_thread(threadTest, ())
  • time.sleep(3)
  • print count
  thread模块是不是并没有想像中的那么难!简单就是美,这就是Python。更多关于thread模块的内容,请参考Python手册 thread 模块

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-130959-1-1.html 上篇帖子: Python入门:字符串与字节互转 下篇帖子: python的学习(九)----多线程编程(2)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表