编辑:在此修订/更新之前这个问题的主要部分是如何终止 QThread。这个问题已经解决了,问题正在修改为如何终止正在进行的请求剩余对象。
http://docs.python-requests.org/en/v0.10.4/user/advanced/#asynchronous-requests 看来使用异步请求仍然会阻塞 - 用户无法在发布过程中取消发布。
基本上这是所需的功能:当用户按下 时Stop Uploading,上传必须立即停止,我可以使用 stop() 停止线程,但是只有在循环再次循环后才会检查是否应该停止。
所以基本上,应该可以使用异步请求,让我检查是否应该在请求期间取消它,但是,我不知道如何取消。
有什么建议么?帖子的前一部分仍然相关,因此如下。
请注意,如何终止 QThread 的最初问题已经解决,因此下面的代码并不是太重要,它只是用于上下文,我现在需要帮助的是我刚才描述的内容。
我一直在编写一个程序,它是一个照片上传器,我创建了一个上传文件的线程。我不知道如何退出线程。我尝试过从这里读到的建议:
1)我尝试了一个 bool 标志,将它包裹在方法和执行工作的 for 语句周围。
2)我使用了“with”,然后尝试设置例外。
我希望能够取消上传,最好是尽快取消。我读过很多文章,总是建议在终止线程之前“清理”线程,老实说,我不知道“清理”是什么意思。但是,我认为我应该能够终止该线程 - 因为它所做的只是将图像的二进制数据发送到 TUMBLR api。如果提前取消请求也没关系,因为它也会取消 api 中的上传。
无论如何,这是我的主题:
Run Code Online (Sandbox Code Playgroud)class WorkThread(QtCore.QThread): def __init__(self): QtCore.QThread.__init__(self) global w w = WorkThread def __del__(slf): self.wait() def run(self): url = 'https://www.tumblr.com/api/write' files = os.listdir(directory) for file in files: file_path = os.path.join(directory + '\\' + file) file_path = str(file_path) if file_path[-3:] in ['bmp', 'gif', 'jpg', 'png', 'thm', …
示例代码:
var isExecutionOver = false,
myFunction = function() {
// does some asynchronous stuff and sets isExecutionOver to true
// when the asynchronous job is over.
};
myFunction();
// Kill myFunction if it takes more than 3 seconds
setTimeout(function() {
if(!isExecutionOver) {
// How do I kill myFunction?
}
}, 3*1000);
Run Code Online (Sandbox Code Playgroud)
myFunction在上面的代码片段中,如果它无法在给定时间内(本例中为 3 秒)完成其工作,我将尝试终止(或者换句话说,停止执行) 。
PS:请假设我无法控制 myFunction 定义。我唯一可以工作的地方就是里面setTimeout。
for (; 1;) {
if (fork() == 0) break;
int sig = 0;
for (; 1; usleep(10000)) {
pid_t wpid = waitpid(g->pid[1], &sig, WNOHANG);
if (wpid > 0) break;
if (wpid < 0) print("wait error: %s\n", strerror(errno));
}
}
Run Code Online (Sandbox Code Playgroud)
waitpid应该立即返回子进程的pid!
但waitpid大约90秒后得到了pid号,
cube 28139 0.0 0.0 70576 900 ? Ss 04:24 0:07 ./daemon -d
cube 28140 9.3 0.0 0 0 ? Zl 04:24 106:19 [daemon] <defunct>
Run Code Online (Sandbox Code Playgroud)
strace -p 28139
Process 28139 attached …Run Code Online (Sandbox Code Playgroud) 我从 makefile 中得到了这一点,我从规则“调试”QEMU 开始,但在我需要使用kill -9 中断QEMU 的地方,也需要makekill:
debug: ${BINDIR}/main
${QEMU} -M versatilepb -m 128M -nographic -kernel $^ -s -S
$(MAKE) sane
gdb: ${BINDIR}/main
${GDB} ${BINDIR}/main
sane:
stty sane
Run Code Online (Sandbox Code Playgroud)
如何在不中断make进程的情况下中断make进程?
如果我使用组合来批量杀死子进程并等待它终止,我使用
kill $PID
wait $PID
Run Code Online (Sandbox Code Playgroud)
如果该进程立即存在,则该进程wait将失败,因为 pid 不再运行。
有没有办法将两个语句组合成一个语句来避免错误?
编辑:我必须杀死的进程使用临时文件;因此它必须关闭(而不仅仅是发出关闭信号)才能再次启动它。检查 的返回值kill无济于事,因为这表明信号是否已成功传递。
在此脚本中:
import threading, socket
class send(threading.Thread):
def run(self):
try:
while True:
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((url,port))
s.send(b"Hello world!")
print ("Request Sent!")
except:
s.close()
except KeyboardInterrupt:
# here i'd like to kill all threads if possible
for x in range(800):
send().start()
Run Code Online (Sandbox Code Playgroud)
是否可以杀死除键盘中断之外的所有线程?我在网上搜索过,是的,我知道已经有人问过这个问题了,但我对Python真的很陌生,而且我对堆栈上提出的其他问题的方法不太了解。
我有一个 Nginx+Gunicorn+Flask 应用程序,它使用机器学习模型提供一些 API。该模型存储在一个大文件中,需要很长时间(大约一分钟)才能加载到内存中。现在我想更新模型文件并在不停机的情况下重新启动工作程序。如何配置gunicorn(或其他东西)等待新进程加载?
仅仅发送kill -HUP似乎不足以达到目的。在新进程加载之前发出的请求似乎被丢弃。
我有一个相当长的 Python 3 代码,它对许多图像进行过采样,然后将它们拟合为 2D 高斯分布,以查找图像中源的相关参数(质心坐标、幅度等),将其移动到中心,标准化,然后堆叠所有这些都以中位数结束。我正在尝试使用大约 50,000 张图像的数据来做到这一点。我已经提取了数据并从以前的代码中保存了它,这给了我一个名为 的文件中所有图像数据(numpy 数组)的二进制文件initial_data.data,并且我还使用了 astropy wcs 包来找到对质心坐标的良好猜测,因此它们也保存(以相同的顺序)在centroid_coords.data. 当我第一次尝试在所有图像上运行我的代码时,它Killed在代码的过采样部分期间说道。然后我决定尝试将所有图像分成几个小节,并一次在一个小节上运行代码。如果只是几个小节,这还可以,但如果我必须一次只处理 5,000 张图像,那就太乏味且不切实际了!下面是我的代码的其余部分,其中我尝试了三分之一的小节,并尝试仅对第一个进行操作(因此我在1第一个用户输入行之后输入)。
import pickle
import numpy as np
import re
from scipy import optimize, interpolate
from astropy.io import fits
from astropy.nddata import Cutout2D
frac = int(input('Subset 1, 2, or 3? ')) # select which subset of images to operate on
oversampled_file = 'oversampled_images_frac%d.data' % (frac)
params_file = 'gparams_2D_frac%d.data' % (frac)
final_images_file = 'images_b4stacking_2D_frac%d.data' % (frac)
FWHM_file = 'FWHM_2D_frac%d.data' …Run Code Online (Sandbox Code Playgroud) 这是我尝试使用高级 asyncio 子进程 API过早终止子进程的程序:
import asyncio
async def test():
process = await asyncio.create_subprocess_shell(
"sleep 2 && echo done",
stdout=asyncio.subprocess.PIPE,
)
await asyncio.sleep(1)
process.kill()
await process.wait()
# process._transport.close()
asyncio.run(test())
Run Code Online (Sandbox Code Playgroud)
退出时,它将以下内容写入stderr:
$ python3.9 test.py
Exception ignored in: <function BaseSubprocessTransport.__del__ at 0x1065f0dc0>
Traceback (most recent call last):
File "/usr/local/Cellar/python@3.9/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/asyncio/base_subprocess.py", line 126, in __del__
self.close()
File "/usr/local/Cellar/python@3.9/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/asyncio/base_subprocess.py", line 104, in close
proto.pipe.close()
File "/usr/local/Cellar/python@3.9/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/asyncio/unix_events.py", line 536, in close
self._close(None)
File "/usr/local/Cellar/python@3.9/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/asyncio/unix_events.py", line 560, in _close
self._loop.call_soon(self._call_connection_lost, exc)
File "/usr/local/Cellar/python@3.9/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/asyncio/base_events.py", line 746, …Run Code Online (Sandbox Code Playgroud) 如何快速关闭VS Code中所有打开的终端?
我有很多打开的终端,我可以一一检查它们并分别杀死它们。或者我可以选择其中的一些,然后杀死选定的批次。但这两种方法都不方便,因为它们需要大量时间。我至少有 10000 个开放终端,而在一批中我可以选择几百个。
有没有办法一次性杀死所有终端?
kill ×10
python ×5
python-3.x ×3
linux ×2
process ×2
waitpid ×2
asynchronous ×1
bash ×1
flask ×1
generator ×1
gnu-make ×1
gunicorn ×1
javascript ×1
makefile ×1
memory ×1
qthread ×1
subprocess ×1
terminal ×1
terminate ×1