【发布时间】:2014-11-06 14:01:19
【问题描述】:
我正在构建一个 Python 脚本/应用程序,它会启动多个所谓的 Fetchers。 他们反过来做一些事情并将数据返回到队列中。
我想确保 Fetcher 的运行时间不超过 60 秒(因为整个应用程序在一小时内运行多次)。
阅读 Python 文档后,我注意到他们说在使用 Process.Terminate() 时要小心,因为它会破坏队列。
我当前的代码:
# Result Queue
resultQueue = Queue();
# Create Fetcher Instance
fetcher = fetcherClass()
# Create Fetcher Process List
fetcherProcesses = []
# Run Fetchers
for config in configList:
# Create Process to encapsulate Fetcher
log.debug("Creating Fetcher for Target: %s" % config['object_name'])
fetcherProcess = Process(target=fetcher.Run, args=(config,resultQueue))
log.debug("Starting Fetcher for Target: %s" % config['object_name'])
fetcherProcess.start()
fetcherProcesses.append((config, fetcherProcess))
# Wait for all Workers to complete
for config, fetcherProcess in fetcherProcesses:
log.debug("Waiting for Thread to complete (%s)." % str(config['object_name']))
fetcherProcess.join(DEFAULT_FETCHER_TIMEOUT)
if fetcherProcess.is_alive():
log.critical("Fetcher thread for object %s Timed Out! Terminating..." % config['object_name'])
fetcherProcess.terminate()
# Loop thru results, and save them in RRD
while not resultQueue.empty():
config, fetcherResult = resultQueue.get()
result = storage.Save(config, fetcherResult)
我想确保当我的一个 Fetcher 超时时我的队列不会损坏。
最好的方法是什么?
编辑:回应与 sebdelsol 的聊天,澄清几点:
1) 我想尽快开始处理数据,否则我必须同时执行大量磁盘密集型操作。所以为 X_Timeout 休眠主线程不是一种选择。
2)我只需要等待一次超时,但是每个进程,所以如果主线程启动 50 个 fetchers,这需要几秒钟到半分钟,我需要补偿。
3) 我想让 确保 来自 Queue.Get() 的数据由未超时的 Fetcher 放在那里(因为理论上可能是 fetcher 将队列中的数据,当超时发生时,它被枪杀......)应该转储该数据。
发生超时并不是一件很糟糕的事情,这不是一个理想的情况,但损坏的数据更糟糕。
【问题讨论】:
标签: python process queue multiprocessing