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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 又来到了一个老生常谈的问题,应用层软件开发的程序员要不要了解和深入学习操作系统呢? 今天就这个问题开始,来谈谈操...
    tangsl阅读 9,608评论 0 23
  • 想和你离的近点,所以我踏上了这片梦中的地方。因为有白云有蓝天有雪山,所以我可以无所顾忌的牵着你的手,让你拥我入怀,...
    CYQY7298阅读 1,501评论 6 4
  • 加拿大有世界上最长的一条路,从多伦多通向北极。玄奘西行,历经九九八十一难和五万里形程,途经一百三十八个国家,最终取...
    唯恐不久存阅读 2,839评论 0 1