- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在构建一个 Python 脚本/应用程序,它会启动多个所谓的 Fetcher。他们反过来做一些事情并将数据返回到队列中。
我想确保 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 个 fetcher,这需要几秒到半分钟,我需要补偿。
3) 我想确定来自 Queue.Get() 的数据是由一个没有超时的 Fetcher 放在那里的(因为从理论上讲,一个 fetcher 可能将Queue中的数据,超时的时候,被拍死了。。。)那个数据应该dump掉。
发生超时并不是一件非常糟糕的事情,这不是一个理想的情况,但损坏的数据更糟。
最佳答案
您可以将新的 multiprocessing.Lock()
传递给您启动的每个提取器。
在fetcher的进程中,一定要用这个锁包裹Queue.put()
:
with self.lock:
self.queue.put(result)
当你需要终止一个 fetcher 的进程时,使用它的锁:
with fetcherLock:
fetcherProcess.terminate()
这样,您的队列就不会因为在队列访问期间终止提取程序而受到破坏。
一些 fetcher 的锁可能会损坏。但是,这不是问题,因为您启动的每个新 fetcher 都有一个全新的锁。
关于python - 使用 Process.Terminate() 时如何解决队列损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25807465/
我一直在尝试配置 Terminator 以尊重我的终端的大小。这可能吗?事实上,每次我重新打开 Terminator 时,我都必须将几个终端的大小调整为我想要的配置。 首选项似乎没有配置这个选项。它似
我正在尝试通过命令在 Mac Catalina 10.15.5 中自动添加 crontab: echo -e "* * * * * \run.sh"|crontab - 此命令复制 crontab -
我有一堆名为1.png,2.png等的png文件,我想从它们全部创建一个动画gif图像。我尚未成功找到将这些png文件转换为单个gif动画的终端命令的解决方案。 有人可以发布一些我可以尝试的命令吗?我
我正在运行 dup1 example来自 The Go Programming Language本书(相关代码如下所示): for input.Scan() { counts[input.Te
有没有办法从命令行启动 gnome-terminal(即,使用/usr/bin/gnome-terminal 命令)并让新终端继承运行命令的终端的环境变量和其他设置变量?场景是这样的: 打开终端 设置
每次我打开终端时,我都会收到这样的信息: bash: /usr/local/Cellar/nvm/0.33.0/nvm.sh: No such file or directory 我试过重新加载。不知
如何更改背景颜色?我选择了 Profile > Background > solid color ,但我在哪里可以选择颜色? 最佳答案 有两种受支持的方法可以更改 xterm 的背景颜色(请记住 xt
我知道我可以右键单击 > 打开选项卡以在 gnome-terminal 中打开一个新选项卡,但是如何从脚本中执行相同操作?如果我使用 'gnome-terminal --tab-with-profil
安装 OSX Lion 后,我尝试: nano /etc/apt/sources.list 但我收到此错误: Error opening terminal: xterm-256color 如果我尝试切
所以我创建了一个名为 specs 的 mysql 表,我想将一个 csv 文件导入到该表中。 CREATE TABLE specs ( `Id` INT NOT NULL, `Brand` V
我正在运行 Xubuntu 13.04,我想使用 Vim 作为我所有的默认编辑器。我下载了很多vim配色方案试了一下,但是都不像官方截图。 例如,vim 自带的颜色模式——沙漠应该是这样的: 但在我的
我在 Mac OS Big Sur 上安装了 Spyder 5。 我从终端运行了这个命令:conda install spyder-terminal -c spyder-ide该命令运行无误。仍然没有
ssh -t remotehost vim /tmp/x.txt 我知道我可以运行上面这样的命令。 但我希望能够在远程计算机上运行任何本地 bash 代码。因此,我想调用远程“bash -s”,以便可
我正在尝试在我的内容管理系统中创建一项功能,用户可以上传 CSV 文件,然后解析该文件并将数据放入 MySQL 数据库中。为此,我使用文件输入和 SQL 查询。 $sql = "LOAD DATA L
我在 .inputrc 上发现了很多问题,答案包括使用 Mac OS X terminal.app 的人。 但是我已经设置了这个属性并且它没有改变 readline 的行为。我在 Ubuntu 上尝试
我正在尝试绘制由 rpart 生成的回归树使用 partykit .假设使用的公式是 y ~ x1 + x2 + x3 + ... + xn .我想要实现的是在终端节点中带有箱线图的树,顶部有一个标签
在 Visual Studio Code 中,Ctrl-k 快捷键绑定(bind)到 clearing the terminal . 我已经configured bash as my terminal
我正在学习斯坦福大学 Andrew Wu 教授的精彩机器学习类(class)。当我在 ex5 文件中执行绘图函数时,octave cli 命令行报告以下警告: set terminal aqua en
我在 Ubuntu 上使用 Python 3.6 的多处理来处理与另一台设备的更快通信。 我设置 daemon = True 以在父进程完成时终止子进程。但是,当主进程终止时,另一个进程(以下代码中的
我有一个 ant 任务,它使用 执行冗长的构建操作. Ant 由 Windows 命令行中的批处理文件启动。如果我通过关闭窗口来终止 ant 任务,则进程由 启动继续运行。当 ant 进程本身终止
我是一名优秀的程序员,十分优秀!