grpc-python07—拦截器 & 多进程

书写拦截器

调用链路、身份验证

  1. init code、detail
  2. 错误函数 grpc_code、abort
  3. intercept_service(self, continuation, header_call_details)

    def _abort(code, details): # unary, stream
    def terminate(ignored_request, context):
        context.abort(code, details)
    
    return grpc.unary_unary_rpc_method_handler(terminate)

class TestInterceptor(grpc.ServerInterceptor):
def init(self, key, value, code, detail):
self.key = key
self.value = value
self.code = code
self._abort = _abort(code, detail)

def intercept_service(self, continuation, handler_call_details):
    """
    :param continuation: 函数执行器
    :param handler_call_details: header
    :return:
    """
    headers = dict(handler_call_details.invocation_metadata)
    if self.key not in headers:
        return self._abort
    # if (self.key, self.value) not in handler_call_details.invocation_metadata:
    #     return self._abort
    if headers.get(self.key) != self.value:
        return self._abort
    return continuation(handler_call_details)

grpc_server = grpc.server(
futures.ThreadPoolExecutor(max_workers=1),
interceptors=(validator, ),
)

# 因为cPython 有全局解释器锁,所以如何改造成多进程呢?

```python
@contextlib.contextmanager
def _reserve_port():
    # with _reserve_port() as xx:
    """
    find and reserve a port for all subprocesses to use
    sudo pop3 install --no-binary grpcio
    由于很多linux系统不支持so_reuseport,所以安装grpcio的时候需要按照上面的这种模式
    安装,时间比较长(多进程监听函数)
    :return:
    """
    sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
    if sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT) == 0:
        raise RuntimeError("Fail to set SO_REUSEPORT")
    sock.bind(("", 6000))
    try:
        yield sock.getsockname()[1] # 返回的就是端口号
    finally:
        sock.close()

# 启动进程数量
_PROCESS_COUNT = multiprocessing.cpu_count()
# 线程数量
_THREAD_CONCURRENCY = _PROCESS_COUNT

def serve(port=6000):
    grpc_server = grpc.server(futures.ThreadPoolExecutor(max_workers=10), compression=grpc.Compression.Gzip)
    pb2_grpc.add_SayHelloServicer_to_server(SayHello(), grpc_server)
    grpc_server.add_insecure_port('localhost:{}'.format(port))
    print("----in serve 子进程 pid=%d ,父进程的pid=%d---" % (os.getpid(), os.getppid()))
    grpc_server.start()
    grpc_server.wait_for_termination()

def main():
    print("----in main 子进程 pid=%d ,父进程的pid=%d---" % (os.getpid(), os.getppid()))
    with _reserve_port() as port:
        # sys.stdout.flush() # 刷新缓存区
        workers = []
        for _ in range(_PROCESS_COUNT):
            worker = multiprocessing.Process(target=serve, args=(port, ))
            worker.start()
            workers.append(worker)

        for worker in workers:
            worker.join()
欢迎使用华华后台进程拦截器。由于现在的播放器尤其是网络播放器,大部分都是带有P2P 后台传输程序的,当您关闭播放器的时候,但是后台程序是没有关闭的。这就导致了,在之后的游戏或是网页浏览时,感觉网速过慢。 那么解决的方法就是关闭后台程序。但是,用户必须有一定的电脑常识 和判断能力。如果您结束了一个正常的系统进程,那么您的电脑运行会不稳定,甚至会重启。所以,我编写了这个小软件,可以在启动本软件后,自动判断有哪些播放器在运行。然后,如果检测到播放器的前台退出后,软件会在5秒钟后结束后台进程,从而省去了您亲自找相关后台进程的烦恼。                                                                             软件截图一                                                                 软件截图二
<think>好的,我现在需要帮助用户解决安装失败的问题,查找导致安装进程异常退出的原因。用户提到了安装失败、进程异常退出、控制台、日志文件和解决方案这几个关键词。首先,我应该根据这些关键词逐步分析可能的原因和解决方法。 首先,用户提到安装进程异常退出,这可能涉及多个方面。我需要回忆之前处理类似问题的经验,并结合提供的引用内容。例如,引用[1]中提到的日志分析,用户可能需要检查日志文件来定位问题。引用[2]中的CrashLoopBackOff状态,虽然主要是Kubernetes的问题,但类似的思路可以应用,比如检查应用程序错误或配置问题。引用[3]是关于ComfyUI安装的教程和解决方案,可能涉及环境依赖或配置错误。 接下来,我需要构建一个清晰的解决步骤。首先应该建议用户检查控制台输出的即时错误信息,因为控制台通常会显示安装过程中的错误,比如权限不足或依赖缺失。然后,查看日志文件,尤其是详细的日志,可能包含更具体的错误信息。例如,引用[1]中的日志帮助定位了进程退出的原因,用户可能需要调整日志级别或查找特定关键字。 然后,考虑系统资源问题,如内存或磁盘空间不足,这可能导致安装进程被终止。权限问题也很常见,特别是在Linux系统中,需要sudo权限或者目录写入权限。依赖缺失是另一个常见原因,尤其是在安装需要编译或外部库的软件时,用户可能需要安装特定的开发包。 环境变量配置错误也可能导致问题,比如PATH设置不正确或缺少必要的变量。如果是特定应用程序的问题,比如引用[3]中的ComfyUI,可能需要检查Python版本、依赖包版本冲突,或者防火墙/安全软件阻止安装进程。 此外,使用调试模式或详细输出可以帮助获取更多信息。如果用户无法自行解决,建议提供日志片段以便进一步分析。 现在需要确保回答结构清晰,分步骤说明,同时结合引用中的案例,比如引用日志分析的重要性,以及检查配置和依赖的方法。还要生成相关问题,覆盖用户可能进一步询问的方向,比如如何查看日志、常见错误代码含义、权限修改方法、环境配置检查等。 最后,验证每个步骤是否符合逻辑,是否覆盖了安装失败的常见原因,并且语言通俗易懂,适合不同技术水平的用户跟随操作。</think>### 安装失败排查与解决方案 #### 1. 检查控制台输出(实时错误定位) - **现象**:安装进程异常退出时,控制台通常会显示最后报错信息 - **关键操作**: - 重新运行安装命令时添加 `--verbose` 参数获取详细输出,例如: ```bash ./installer --verbose > install.log 2>&1 ``` - 观察报错关键词: - `Permission denied` → 权限问题 - `No space left` → 磁盘空间不足 - `dependency not found` → 依赖缺失 - `Segmentation fault` → 内存访问错误 #### 2. 分析日志文件(系统级诊断) - **日志位置**: - 系统日志:`/var/log/syslog` 或 `journalctl -u 服务名` - 应用日志:通常位于 `/var/log/安装目录/` 或用户目录的隐藏文件夹 - **分析方法**: ```bash # 按时间过滤日志(假设安装发生在09:00-09:10) grep "2023-08-20 09:0[0-9]" /var/log/syslog | less # 搜索关键错误级别 grep -E 'ERR|ERROR|FATAL' install.log ``` *类似引用[1]中通过日志定位gRPC连接中断的案例,日志中的状态码/错误描述是诊断关键[^1]* #### 3. 常见原因及解决方案 | 问题类型 | 检测方法 | 解决方案 | |----------------|-----------------------------------|--------------------------------------------------------------------------| | **权限不足** | `ls -l 安装目录` 查看写权限 | 使用 `sudo` 执行安装 或 `chmod -R 755 目标目录` | | **依赖缺失** | 查看报错中的库文件名称 | 使用包管理器安装:`apt-get install libxxx` 或 `pip install package==版本` | | **资源不足** | `free -h` 看内存,`df -h` 看磁盘 | 清理磁盘空间,增加swap分区,关闭占用资源的进程 | | **环境冲突** | `echo $PATH`, `python --version` | 使用虚拟环境(conda/venv),检查JAVA_HOME等环境变量 | | **杀毒软件拦截**| 临时关闭防火墙/安全软件 | 添加安装程序到白名单,或使用企业版安全策略例外 | #### 4. 高级诊断手段 - **进程跟踪**: ```bash strace -f -o install.strace ./installer ``` 分析最后的系统调用(如`openat`访问文件,`connect`网络连接) - **核心转储分析**(出现段错误时): ```bash ulimit -c unlimited ./installer # 等待崩溃生成core文件 gdb ./installer core --batch -ex "bt full" ``` #### 5. 特定场景解决方案 - **Kubernetes环境问题**(类似引用[2]的CrashLoopBackOff): ```bash kubectl describe pod <pod-name> # 查看Events部分 kubectl logs --previous <pod-name> # 查看上次崩溃日志 ``` - **Python包安装失败**: ```bash pip install --no-cache-dir package # 禁用缓存 export CFLAGS="-I/usr/local/include" # 指定头文件路径 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值