dot*_*hen 5 python multithreading
我有一个应用程序,每隔几分钟轮询一堆服务器.为此,它为每个服务器生成一个线程进行轮询(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);
Run Code Online (Sandbox Code Playgroud)
该CallThreads班是一个辅助函数来调用一个函数(在这种情况下,poll_server()带有参数(在这种情况下s和results),你可以在我的GitHub库看到源Python的实用功能.大部分能正常工作的时间,但是有时候一个线程间歇我不知道为什么,因为我在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)
Run Code Online (Sandbox Code Playgroud)
我怎么处理这个?似乎没有办法杀死 一个 阻塞 线程 在 Python中.这个应用程序需要在Raspberry Pi上运行,因此扭曲的大型库不适合,实际上我也需要摆脱请求库!
据我所知,一种可能的情况是,当一个给定服务器的线程“挂起”时,它将“永远”留在那里。下次您查询服务器时,会生成另一个线程 ( _start_new_thread),直到 Python 崩溃。
可能不是您的(主要)问题,但您应该:
results. 也许是一个semaphore或mutex来锁定代码的原子部分。可能更好的是专用数据结构,例如queue.关于“挂起”本身,请注意“打开 URL”( urlopen ) 时的超时参数与建立连接的超时有关。不用于下载实际数据:
可选的 timeout 参数指定阻塞操作(如连接尝试)的超时(以秒为单位)(如果未指定,将使用全局默认超时设置)。这实际上仅适用于 HTTP、HTTPS 和 FTP 连接。
| 归档时间: |
|
| 查看次数: |
839 次 |
| 最近记录: |