Python崩溃的输出原因

2024-09-27 00:19:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个应用程序,每隔几分钟就对一堆服务器进行轮询。为此,它为每台服务器生成一个线程来轮询(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崩溃:

^{pr2}$

我该怎么处理?似乎没有办法killablockingthreadinPython。这个应用程序需要在Raspberry Pi上运行,所以像twisted这样的大型库不适合,事实上我还需要去掉requests库!在


Tags: self服务器add应用程序serverdefsomeargument
1条回答
网友
1楼 · 发布于 2024-09-27 00:19:30

据我所知,一个可能的场景是当一个线程“挂起”一个给定的服务器时,它将“永远”留在那里。下次查询服务器时,会产生另一个线程(_start_new_thread),直到Python崩溃为止。在

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

  • 使用一个线程池-这不会像一次又一次地产生新的线程那样对系统有限的资源造成压力。在
  • 检查是否使用“线程兼容”机制来处理对results的并发访问。可能是^{}或{a2}来锁定代码的原子部分。最好使用专用的数据结构,比如^{}。在

关于“挂起”本身,请注意,“打开URL”(urlopen)时的timeout参数与建立连接的超时有关。不用于下载实际数据:

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.

相关问题 更多 >

    热门问题