您的位置:首页 > 编程语言 > Python开发

Python实战之多线程编程thread模块

2011-02-17 08:14 471 查看
在Python中除了可以通过继承threading.Thread类来实现多线程外,也可以调用thread模块中的start_new_thread()函数来产生新的线程,如下

import time, thread
def timer():
print('hello')
def test():
for i in range(0, 10):
thread.start_new_thread(timer, ())
if __name__=='__main__':
test()
time.sleep(10)


或者

import time, thread
def timer(name=None, group=None):
print('name: ' + name + ', group: ' + group)
def test():
for i in range(0, 10):
thread.start_new_thread(timer, ('thread' + str(i), 'group' + str(i)))
if __name__=='__main__':
test()
time.sleep(10)


这个是thread.start_new_thread(function,args[,kwargs])函数原型,其中function参数是你将要调用的线程函数;args是讲传递给你的线程函数的参数,他必须是个tuple类型;而kwargs是可选的参数。线程的结束一般依靠线程函数的自然结束;也可以在线程函数中调用thread.exit(),他抛出SystemExit exception,达到退出线程的目的。

下面来看一下thread中的锁机制,如下两段代码:

代码一

import time, thread
count = 0
def test():
global count

for i in range(0, 10000):
count += 1

for i in range(0, 10):
thread.start_new_thread(test, ())
time.sleep(5)
print count


代码二

import time, thread
count = 0
lock = thread.allocate_lock()
def test():
global count, lock
lock.acquire()

for i in range(0, 10000):
count += 1

lock.release()
for i in range(0, 10):
thread.start_new_thread(test, ())
time.sleep(5)
print count


代码一中的值由于没有使用lock机制,所以是多线程同时访问全局的count变量,导致最终的count结果不是10000*10,而代码二中由于是使用了锁,从而保证了同一个时间只能有一个线程修改count的值,所以最终结果是10000*10.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: