python 多线程模块,Python模块学习之thread多线程处理

标准库提供了和threading两个模块来对多线程进行支持。其中,thread模块以低级、原始的方式来处理和控制线程,

而threading模块通过对thread进行二次封装,提供了更方便的api来处理线程。

虽然使用thread没有threading来的方便,但它更灵活。今天先介绍thread模块的基本使用。

在介绍 thread 之前,先看一段代码,猜猜程序运行完成之后,在控制台上输出的结果是什么?

#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是可选的,它为函数提供了命名参数字典。

函数执行完毕之后,线程将自动退出。如果函数在执行过程中遇到未处理的异常,该线程将退出,但不会影响其他线程的执行。

下面是一个简单的例子:

#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,在主线程中捕获异常:

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操作的时候,进行加琐处理。看看程序运行的结果是否和预期一致。

修改后的代码:

#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模块

01903f2303fd0ac74e96dd767b78fe22.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值