python中多线程及锁的应用

python中的多线程执行可以使用threading模块,导入该模块然后可以利用模块中的多线程类来编写多线程程序,一般涉及到多线程程序的话就避不开锁,因为线程一般是共享进程的资源,所以当多线程要访问进程的资源时,为了保证一致性就要加锁。

在python中多线程实现主要是两种方式:1.直接生成threading.Thread的实例;2.以对象的方式(OOP)实现

1.直接生成threading.Thread的实例,如下:

#生成一个线程p,要去执行的方法就是fun
p = threading.Thread(target=fun)

2.以对象的方式(OOP)实现

这种方式主要是自己声明一个线程类,并继承threading.Thread类,然后实现run方法,该run方法就类似上面的fun,是线程要去执行的方法。

第二种方式跟第一种方式其实本质完全相同,所以这里主要是使用第一种方法来实现一下比较经典的生产者和消费者问题,生产者和消费者都是用多线程来模拟,这里用10个线程来模拟生产者,10个线程来模拟消费者。因为生产者和消费者都要共用goods这个临界资源,所以为了保证goods计数的准确性,在对goods进行修改时要加锁,这就保证goods的修改具有一致性,即一次只能有一个线程对其进行操作。

代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

__author__ = 'iaccepted'


import threading
import time
import os

#线程休眠0.5秒,主要是为了能更好的看到不同线程之间交叉执行
def do_a_sleep():
    time.sleep(0.5)

def produce(tid):                      #生产者线程要调用的方法
    global goods
    global lock
    while True:
        lock.acquire()
        try:
            if goods < 20:               #仓库总共能存放100件商品
                goods += 1
                print(tid, '\t生产一件商品,现在总共有\t%d\t件商品' % goods)
        finally:
            lock.release()
        do_a_sleep()

def consume(tid):                        #消费线程调用的方法
    global goods
    global lock
    global con
    while True:
        lock.acquire()
        try:
            if goods != 0:
                goods = goods - 1
                print(tid, '\t消费一件商品,现在总共有\t%d\t件商品' % goods)
        finally:
            lock.release()
        do_a_sleep()                    

goods = 0
lock = threading.Lock()

if __name__ == '__main__':
    #启动10个消费者线程
    for k in range(10):
        p = threading.Thread(target=consume,args=(k,))   
        p.start()


    #启动10个生产者线程
    for k in range(10):
        p = threading.Thread(target=produce, args=(k + 10,))
        p.start()

这里有个点需要说明一下,释放锁的代码放在了finally块中,是因为在多线程环境下,要保证每个线程申请的锁最终都要被释放,所以放在finally块中就可以保证各种情况下,锁一定会被释放。

本文遵从CC3.0协议转载请注明:转自凌风技术站

本文标题:python中多线程及锁的应用

本文链接地址:http://www.iaccepted.net/python/tutorial/54.html

相关文章



发表评论

电子邮件地址不会被公开。 必填项已用*标注