python多线程编程(一)--thread模块

作者:金牛区福生殡葬服务部 来源:www.cdfsbz.com 发布时间:2017-09-03 12:35:26
python多线程编程(一)--thread模块

python提供两个模块支持多线程编程:thread和threading。

thread模块函数

函数

描述

start_new_thread(function,args,kwargs=None)

产生一个新线程,在新线程中用指定参数和可选的kwargs调用function函数

allocate_lock()

分配一个LockType类型的锁对象(注意,此时还没有获得锁)

exit()

退出线程

LockType类型锁对象的函数

acquire(wait=None)

尝试获取锁对象

locked()

如果获得了锁对象返回True,否则返回False

release()

释放锁

接下来使用thread模块编写多线程。

#coding: utf-8 import thread from time import sleep, ctime def loop0(): print 'loop0 start at:', ctime() print 'loop0挂起4秒' sleep(4) print 'loop0 done at:', ctime() def loop1(): print 'loop1 start at:', ctime() print 'loop1挂起2秒' sleep(2) print 'loop1 done at:', ctime() def main(): print 'main thread start!' thread.start_new_thread(loop0, ()) thread.start_new_thread(loop1, ()) sleep(6) #主线程睡眠等待子线程结束 print 'all done at:', ctime() if __name__ == '__main__': main()

运行结果:

\


下面代码的运行结果都是这样,就不给出了。

相信大家都看到注释,这种方法的缺点就在主线程要睡眠一段时间等待子线程全部结束,不然如果结束主线程,那么子线程都会结束。但是子线程会运行多长时间一般是很难确定的。

下面我们看第二种方法。vc3Ryb25nPjwvcD4KPHA+vMjIu7K71qq1wNfTz9+zzLXE1rTQ0MqxvOSjrMTHw7TO0sPHu7vSu9bWt73KvaOsztLDx7LJ08PL+LXEt73KvcC0v9jWxtb3z9+zzM3Ls/ahozwvcD4KPHA+PHN0cm9uZz7Tw8v41PXDtMq1z9a24M/fs8zE2KO/ttTT2sO/0ru49tfTz9+zzKOsztLDx7a8uPjL/LzTy/ijrNTa1rTQ0L3hyvi689TZys23xcv4o6zV4tH51vfP37PMtcS5pNf3vs3Kx7zssunDu9K7uPbX08/fs8y1xLzTy/jXtMyso6zI57n7trzS0b6tys23xcv4wcujrMTHvs2x7cq+19PP37PMyKuyv9a00NC94cr4o6y+zb/J0tTNy7P2wcuhozwvc3Ryb25nPjwvcD4KPHA+v7S+38zlyrXP1rT6wuujujwvcD4KPHA+PC9wPgo8cHJlIGNsYXNzPQ=="brush:java;">#coding: utf-8 import thread from time import sleep, ctime loops = [4,2] def loop(nloop, nsec, lock): print 'loop', nloop, 'start at:', ctime() print 'loop %d 挂起%d秒' % (nloop, nsec) sleep(nsec) print 'loop', nloop, 'done at:', ctime() lock.release() def main(): print 'main thread start!' locks = [] #锁列表 nloops = range(len(loops)) for i in nloops: lock = thread.allocate_lock() lock.acquire() locks.append(lock) for i in nloops: thread.start_new_thread(loop, (i, loops[i], locks[i])) for i in nloops: while locks[i].locked(): pass #主线程检查每一个子线程的加锁状态 print 'all done at:', ctime() if __name__ == '__main__': main()

实际上,我们不建议使用thread模块。首先,更高级别的threading模块更为先进,对线程的支持更为完善,站群,而且使用thread模块里的属性有可能会与threading出现冲突。其次,低级别的thread模块的同步原语只有一个,而threading模块则有很多。

还有一个原因是,使用thread对于你的进程什么时候应该结束完全没有控制,当主线程结束时,所有的线程都会被强制结束掉,没有警告也不会有正常的清除工作。但是threading模块能确保重要的子线程退出后进程才退出。

不过如果想访问线程的底层结构,那就可能要使用thread模块了。

我们将在下一篇文章给出threading模块的使用。

企业建站2800元起,携手武汉肥猫科技,做一个有见地的颜值派!更多优惠请戳:孝感网站制作 http://xiaogan.666rj.com

  • 上一篇:架设一个网站的基本条件
  • 下一篇:最后一页
  • 
    COPYRIGHT © 2015 金牛区福生殡葬服务部 ALL RIGHTS RESERVED.
    购买cdfsbz.com友情链接、项目合作请联系客服QQ:2500-38-100 邮箱:2500-38-100#QQ.com(#换@)
    本站所有原创信息,未经许可请勿任意转载或复制使用 网站地图 技术支持:肥猫科技
    精彩专题:网站建设
    购买本站友情链接、项目合作请联系客服QQ:2500-38-100