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()

运行结果:

\

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

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

下面我们看第二种方法。<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">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模块的使用。

相关内容

    暂无相关文章

评论关闭