Python: Can't start new thread解决方案(设置线程上限)

背景:

在编写一个爬虫的时候,检查用多线程来检测结果有效性的时候,线程启动过多报错:

thread.error: can't start new thread

方案:使用Thread中的event,并进行上锁设置来解决。

原因:这个是由于每台计算机能进行的并行是有上限的,经过测试本机的上限为1023个左右(win7 64位,i3 2核4线程),可以进行设置提高上限,但我觉得此处没有必要,也不方便扩展,所以想自行定义一个并行的上限数进行处理。

参考:在多次百度无果之后,选择了google,查看了国外的一些评论和解决方案,在google学术中搜索“python thread number limit”,下载了此篇pdf,在13-14页中找到了解决方案,果然是老外做的东西,老外更懂啊。

http://python-ray.googlecode.com/hg-history/425d613ba8a2c7bd367b573018df45e5ec474428/doc/PyThreads.pdf

解决方案:

具体解决方案如下,对应的代码加上了注释。

#coding=utf-8
import threading

class scanner(threading.Thread):
    tlist=[] #用来存储队列的线程
    maxthreads=100 # int(sys.argv[2])最大的并发数量,此处我设置为100,测试下系统最大支持1000多个
    evnt=threading.Event()#用事件来让超过最大线程设置的并发程序等待
    lck=threading.Lock() #线程锁
    def __init__(self):
        threading.Thread.__init__(self)
    def run(self):
        try:
            pass
        except Exception,e:
            print e.message
        #以下用来将完成的线程移除线程队列
        scanner.lck.acquire()
        scanner.tlist.remove(self)
        #如果移除此完成的队列线程数刚好达到99,则说明有线程在等待执行,那么我们释放event,让等待事件执行
        if len(scanner.tlist)==scanner.maxthreads-1:
            scanner.evnt.set()
            scanner.evnt.clear()
        scanner.lck.release()
    def newthread(proxy,counter):
        scanner.lck.acquire()#上锁
        sc=scanner()
        scanner.tlist.append(sc)
        scanner.lck.release()#解锁
        sc.start()
    #将新线程方法定义为静态变量,供调用
    newthread=staticmethod(newthread)

def runscan():
    for i in 1 .. 100:
        scanner.lck.acquire()
        #如果目前线程队列超过了设定的上线则等待。
        if len(scanner.tlist)>=scanner.maxthreads:
            scanner.lck.release()
            scanner.evnt.wait()#scanner.evnt.set()遇到set事件则等待结束
        else:
            scanner.lck.release()
        scanner.newthread(proxy,counter)
       
    for t in scanner.tlist:
        t.join()#join的操作使得后面的程序等待线程的执行完成才继续

if __name__=="__main__":
    runscan()

 

??proxy,counter

转自:http://www.cnblogs.com/freeideas/archive/2013/05/05/3060812.html

### 回答1: 当你看到 "Python: can't open file" 这个错误信息时,通常表示 Python 解释器无法找到或打开指定的文件。 这可能是由于以下原因之一导致的: 1. 文件路径不正确。请确保你输入的文件路径是正确的,包括文件名和文件扩展名。 2. 文件不存在。请检查文件是否存在于指定的路径中。 3. 权限问题。如果你尝试打开一个受保护的文件或文件夹,可能会遇到权限问题。请确保你有足够的权限打开文件。 4. 文件正在使用中。如果文件正在被其他进程或程序占用,Python 可能无法打开它。请关闭其他程序并重试。 希望这些信息能对你有所帮助! ### 回答2: Python: Can't open file是指Python无法打开特定文件或脚本。有几个可能的原因: 1. 文件不存在或拼写错误。如果您输入的文件名不正确或文件不存在,Python将无法打开它并显示错误消息。 2. 文件权限问题。如果文件具有不正确的读取或写入权限,Python将无法打开它。确保您具有足够的权限来打开该文件。 3. 硬盘或文件系统故障。如果磁盘出现问题或文件系统损坏,Python可能无法打开文件。 4. Python版本问题。如果文件是使用不同的Python版本编写的,可能会遇到Python版本不兼容的问题。 为了解决这个问题,您可以尝试以下方法: 1. 检查文件是否存在,并确保输入的文件名正确。 2. 检查文件权限,并确保您有足够的权限来打开它。 3. 尝试使用其他程序打开该文件,以检查文件是否已损坏或无法打开。 4. 检查您的Python版本,并确保文件与您的Python版本兼容。 如果您仍然无法解决问题,您可以寻求帮助或参考Python文档、论坛或社区来获取更多信息和支持。 ### 回答3: Python: can't open file,通常是因为Python在执行相应的文件时无法找到该文件或没有权限打开该文件。 一般情况下,Python无法找到文件是因为文件路径错误。如果您在命令行中运行Python文件,则需要确保文件路径正确。如果您使用相对路径,请确保当前工作目录正确。如果您使用绝对路径,请确保文件路径正确。如果您在Python代码中打开文件,则需要检查文件路径是否正确。 另外,Python也可能无法打开文件,因为它没有权限访问该文件。这通常发生在您尝试在只读文件上写入数据时,或者尝试访问其他用户或系统文件时。在这种情况下,您可能需要更改文件权限或使用管理员权限运行Python。 最后,Python: can't open file也可能是因为文件损坏或删除造成的。如果您确定文件存在且路径正确,但仍然无法打开该文件,则可能需要检查文件是否存在问题或已被删除。在这种情况下,您可能需要从备份中恢复文件或重写文件。 总之,Python: can't open file的原因可能有很多,需要仔细检查文件路径、权限和文件本身是否正确,才能解决该问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值