python爬虫多线程死锁的解决方案

前不久学校刚上了<<计算机操作系统>>,
现在一想,之前多线程阻塞的原因似乎找到了。
所以抽空用python实现了两种信号量机制以避免进程死锁。

# -*- coding: utf-8 -*-
"""
Created on Mon Mar 27 19:38:04 2017
"""
import queue
import threading
# empty表示空的进程, full表示忙碌
# queue的设计就是自带锁的,所以很安全,理论上不会死锁
#############33整型信号量##################
#lock信号量为1为空,可以运行程序,0表示有线程已经占用,
#为在函数中修改值将lock信号量改为类中的成员变量
class lock:
    '''
    需要让信号量的加减放在锁前面
    '''
    def __init__(self,lock):
        self.lock=lock
        self.sign=1
    def wait(self,i):
        while(self.sign==0):
            ##print("为避免死锁,No.%d循环等待....."%i)
            if(self.sign==1):
                self.sign=self.sign-1
                self.lock.acquire()
                break
    def signal(self,i):
        #print("No.%d打开锁"%i)
        self.lock.release()
        self.sign=self.sign+1

########记录型信号量###########
class semaphore:
    def __init__(self,lock,queue_length):
        self.lock=lock
        self.thread_num=0  #一个临时变量
        self.sign=1    #信号量1/0
        self.block_list=queue.Queue(queue_length)   #有优先顺序的阻塞队列
    def wait(self,i):  #i是线程的编号
        q=self.block_list
        if(self.sign==0):
            while(self.block_list.empty()==False):
                self.thread_num=self.block_list.get()
                if(i==self.thread_num):
                    break
                self.block_list.put(self.thread_num)
            while(self.sign==0):
                #print("为避免死锁,No.%d循环等待....."%i)
                if(self.sign==1):
                    print("***No.%d 申请资源成功...."%i)
                    self.sign=self.sign-1
                    self.lock.acquire()
                    break
        elif(self.sign==1):
            print("---No.%d 申请资源成功...."%i)
            self.sign=self.sign-1
            self.lock.acquire()
    
    def signal(self,i):
        print("No.%d 释放锁......"%i)
        self.lock.release()
        self.sign=self.sign+1

你可能感兴趣的:(python爬虫多线程死锁的解决方案)