加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

Python崩溃的输出原因

发布时间:2020-12-16 21:48:56 所属栏目:Python 来源:网络整理
导读:我有一个应用程序,每隔几分钟轮询一堆服务器.为此,它为每个服务器生成一个线程进行轮询(15个服务器)并将数据写回到对象: import requestsclass ServerResults(object): def __init__(self): self.results = [] def add_server(some_argument): self.results

我有一个应用程序,每隔几分钟轮询一堆服务器.为此,它为每个服务器生成一个线程进行轮询(15个服务器)并将数据写回到对象:

import requests

class ServerResults(object):
    def __init__(self):
        self.results = []

    def add_server(some_argument):
        self.results.append(some_argument)

servers = ['1.1.1.1','1.1.1.2']
results = ServerResults()

for s in servers:
    t = CallThreads(poll_server,s,results)
    t.daemon = True
    t.start()

def poll_server(server,results):
    response = requests.get(server,timeout=10)
    results.add_server(response.status_code);

CallThreads类是一个调用函数的辅助函数(在本例中是带参数的poll_server()(在本例中是s和结果),你可以看到我的Github repo为Python utility functions的源代码.大多数时候这个工作正常,但是有时一个线程间歇性地挂起.我不知道为什么,因为我在GET请求上使用了超时.无论如何,如果线程挂起,则挂起的线程会在数小时或数天内累积,然后Python崩溃:

  File "/usr/lib/python2.7/threading.py",line 495,in start
    _start_new_thread(self.__bootstrap,())
thread.error: can't start new thread

Exception in thread Thread-575 (most likely raised during interpreter shutdown)
Exception in thread Thread-1671 (most likely raised during interpreter shutdown)
Exception in thread Thread-831 (most likely raised during interpreter shutdown)

我怎么处理这个?似乎没有办法到0781 a blocking thread in Python.这个应用程序需要在Raspberry Pi上运行,所以像twisted这样的大型库不适合,实际上我也需要摆脱requests库!

最佳答案
据我所知,一个可能的情况是当一个线程为一个给定的服务器“挂起”时,它将“永远”停留在那里.下次查询服务器时,会生成另一个线程(_start_new_thread),直到Python崩溃.

可能不是你的(主要)问题,但你应该:

>使用线程池 – 这不会对系统的有限资源施加压力,就像一次又一次地生成新线程一样.
>检查您是否使用“线程兼容”机制来处理对结果的并发访问.也许是semaphoremutex来锁定代码的原子部分.可能更好的是专用数据结构,例如queue.

关于“挂起”本身 – 请注意“打开URL”(urlopen)时的超时参数与建立连接的超时有关.不是为了下载实际数据:

The optional timeout parameter specifies a timeout in seconds for
blocking operations like the connection attempt (if not specified,the
global default timeout setting will be used). This actually only works
for HTTP,HTTPS and FTP connections.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读