Python线程的使用有两种:基于thread模块的start_new_thread方法和基于threading模块的Thread类。
1.基于thread模块的start_new_thread方法:
import thread
from time import sleep
from random import randint
def display(name, count):
if count > 1:
print "Now, %s has %d apples.\n" % (name, count),
elif count == 1:
print "Now, %s has only one apple.\n" % name,
else:
print "Now, %s has not any apples.\n" % name,
def eat_apple(name, count):
display(name, count)
while count > 0:
print "%s eats an apple.\n" % name,
count -= 1
display(name, count)
sleep(randint(1, 3))
try:
thread.start_new_thread(eat_apple, ("Huey", 3) )
thread.start_new_thread(eat_apple, ("Sugar", 5) )
except Exception, e:
print "Thread Error\n",
基于thread模块的start_new_thread方法已经不推荐使用了,在IDLE中这段代码可以正确运行,在其他环境下可能会报如下错误:
Unhandled exception in thread started by sys.excepthook is missing lost sys.stderr
原因:启动线程之后,须确保主线程等待所有子线程返回结果后再退出,如果主线程比子线程早结束,无论其子线程是否是后台线程,都将会中断,抛出这个异常 。
2.基于threading模块的Thread类:
from threading import Thread
from time import sleep
from random import randint
def display(name, count):
if count > 1:
print "Now, %s has %d apples.\n" % (name, count),
elif count == 1:
print "Now, %s has only an apple.\n" % name,
else:
print "Now, %s has not any apples.\n" % name,
def eat_apple(name, count):
display(name, count)
while count > 0:
print "%s eats an apple.\n" % name,
count -= 1
display(name, count)
sleep(randint(1, 3))
class MyThread(Thread):
"""docstring for MyThread"""
def __init__(self, name, count):
super(MyThread, self).__init__()
self.name = name
self.count = count
def run(self):
eat_apple(self.name, self.count)
huey = MyThread("Huey", 3)
sugar = MyThread("Sugar", 5)
huey.start()
sugar.start()
3. 线程同步问题:
# encoding: utf-8
from threading import Thread
from threading import Lock
from time import sleep
from random import randint
# 仓库有十个槽位
storehouse = [0] * 10
# 线程锁
lock = Lock()
class Producer(Thread):
u"""生产者,依次往仓库里的十个槽位生产产品"""
def __init__(self):
super(Producer, self).__init__()
def run(self):
print "Producer starts producing...\n",
x = 0
while x < len(storehouse):
# 获取锁
lock.acquire()
print "Producer is producing the No.%d product.\n" % x,
storehouse[x] = 1
print "Now, the storehouse is %s\n" % storehouse,
# 释放锁
lock.release()
x += 1
sleep(randint(1, 3))
print "Producer has produced all the products!\n",
class Consumer(Thread):
u"""消费者,依次消费仓库里十个槽位的产品,如果槽位还没有商品,则等待生产者生产"""
def __init__(self):
super(Consumer, self).__init__()
def run(self):
print "Consumer starts consuming...\n",
x = 0
while x < len(storehouse):
print "Consumer wants to consume a product...\n",
# 获取锁
lock.acquire()
if storehouse[x] <= 0:
print "There are not any products, the consumer waits.\n",
else:
print "Consumer is consuming the No.%d product.\n" % x,
storehouse[x] = -1
print "Now, the storehouse is %s\n" % storehouse,
x += 1
# 释放锁
lock.release()
sleep(randint(1, 3))
print "Consumer has consumed all the products!\n",
print "Originally, the storehouse is ", storehouse
producer = Producer()
consumer = Consumer()
producer.start()
consumer.start()
# 阻塞线程,等待其他线程结束
producer.join()
consumer.join()
print "Finally, the storehouse is ", storehouse