多线程处理并发-threading
一分钟了解threading的方法
threading提供了一个比thread模块更高层的API来提供线程的并发性。这些线程并发运行并共享内存。
- 实例化Thread对象 threading.Thread,使用start()
- threading.activeCount() 获取进程数
- threading.enumerate() 返回当前运行中Thread的对象列表
- setDaemon(True) 设置后台服务
话不多说,上代码:
# -*-coding:utf-8-*-
__author__ = 'xihu'
import time
import threading
def worker():
print "worker!"
time.sleep(1) # 亲测:将本行放在输出之前,执行程序不会打印(放置后台);但是放在后面为什么会有输出
return
start = time.time()
# 并发
for i in xrange(5):
t = threading.Thread(target=worker)
# 设置后台进程
t.setDaemon(True)
t.start()
# threading.activeCount()包含主进程的个数
print "current has %d threads" % (threading.activeCount() - 1)
# threading.enumerate()返回当前运行中Thread的对象列表
for item in threading.enumerate():
print item
end = time.time()
print end - start
# # 非并发
# if __name__ == "__main__":
# start = time.time()
# for i in xrange(5):
# worker()
# end = time.time()
# print end - start #运行时间
运行对比:
#并发:
worker!worker!
worker!worker!
worker!
current has 5 threads
<_MainThread(MainThread, started 140735323890432)>
<Thread(Thread-1, started daemon 4539203584)>
<Thread(Thread-4, started daemon 4551823360)>
<Thread(Thread-3, started daemon 4547616768)>
<Thread(Thread-2, started daemon 4543410176)>
<Thread(Thread-5, started daemon 4556029952)>
运行时间:0.00204181671143
# 非并发
worker!
worker!
worker!
worker!
worker!
运行时间:5.01394915581
遇到问题:
1、使用并发引入threading,运行程序直接报错:AttributeError: ‘module’ object has no attribute ‘Thread’
尴尬!因为开始没注意文件名是threading…所以以后文件名尽量避免使用保留字
2、设置后台运行程序:将本行sleep放在输出之前,执行程序不会打印(放置后台);但是放在后面为什么会有输出