0%

Visual Studio依赖

在Visual Studio 2017之前版本需要手动搭建Python的pyd模块开发环境,Visual Studio 2017或更高版本,可安装Python开发工作负载,其内包含了Python本机开发工具,可以直接使用Python 扩展模块模板来初始化pyd项目。

以Python扩展模块模板创建项目

项目生成的实际上就是dll模块,不过会把目标文件扩展名修改为pyd,同时会把Python相关的头文件库文件路径自动引入进来。另外该模板使用的调试器是Python/Native Debugging,调试时会启动一个Python Shell,并自动把项目模块import进来。

Notes:如果需要依赖第三方的动态库,可以考虑调整项目调试的工作目录

如果想要单独创建一个测试用例项目可以这么做,创建一个Python子项目,然后把pyd模块的生成路径包含进搜索路径中,不过一般可能没这个必要,看实际需求。

开发相关指引

阅读全文 »

官方文档:Visual Studio命令

  • 执行Shell命令:Tools.Shell [/command] [/output] [/dir:folder] path [args]
  • 启动调试:Debug.Start [address]
  • 列出模块:Debug.ListModuels
  • 列出线程:Debug.ListThreads [index]
  • 快速监视:Debug.QuickWatch
  • 监视:Debug.Watch[index],index需要跟在Watch后面,并且为整数
  • 新建文件:File.NewFile [filename] [/t:templatename] [/editor:editorname]
  • 列出源:Debug.ListSource [/Count:number] [/Current] [/File:filename] [/Line:number] [/ShowLineNumbers:yes|no]
  • 列出内存:Debug.ListMemory [/ANSI|Unicode] [/Count:number] [/Format:formattype] [/Hex|Signed|Unsigned] [expression]
  • 列出调用堆栈:Debug.ListCallStack
  • 列出反汇编:Debug.ListDiassembly

这里记录下几个编译器预定义宏,得到函数名和函数签名(对于类方法或者模板函数,得到的是完整的签名)。

严格来说它们并不是宏,而是编译器提供的Magic Identifier,它们扩展出来的形式如下:

1
static const char __func__[] = "function-name ";

函数名

  • __func__:C99/C++99标准提供,早期Microsoft C++ Compiler不支持
  • __FUNCTION__

兼容GUNC以及Microsoft C++ Compiler的写法:

1
2
3
4
5
6
7
#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 19901L
#define __FUNC__ __func__
#elif defined(__cplusplus) && __cplusplus >= 19901L
#define __FUNC__ __func__
#else
#define __FUNC__ __FUNCTION__
#endif

函数签名

  • __PRETTY__FUNCTION__:这不是标准提供的,是gcc的扩展,Microsoft C++ Compiler不支持
  • __FUNCSIG__:在Microsoft C++ Compiler中,使用这个

兼容GUNC以及Microsoft C++ Compiler的写法:

阅读全文 »

雪崩效应

分布式架构中的服务基本都存在依赖调用关系,每个服务在生产环境下都是避免不了出现故障的,当某个服务发生了故障,会导致连接(依赖)到它的所有请求超时,这时如果没有合适的处理机制,这种超时便会在生产系统中蔓延和累积,造成级联故障,进而可能使整个系统不可用,这种现象就是服务雪崩效应

熔断器(Circuit Breaker)

熔断器(断路器)就是容器管理工具,通过熔断机制控制服务和第三方库的节点,从而为延迟和故障提供强大的容错能力。

它的基本机制类似于家电的电路熔断器,当电路发生短路时立即熔断电路,避免发生灾难。应用于微服务上就是,熔断器可识别某个服务节点是否出现故障、大量超时的情况,这种时候需要主动熔断,比如返回一个备选响应(FallBack),而不是长时间等待或者抛出异常,这样就可以保证服务调用方不会被长时间不必要地占用,从而避免故障在分布式架构中蔓延和积累,乃至雪崩。

熔断器的基本思想:将一个受保护的函数调用包含在用于监视故障的熔断器对象中,一旦故障数达到一个阈值,熔断器便会跳闸,并且对熔断器的所有后续调用都将返回错误,完全不接受对受保护函数的调用。通常,如果熔断器发生跳闸,还需要监控报警。

From:《Docker微服务架构实战》 - P69

有的熔断器(比如Netflix Hystrix)可以实现弹性容错,当服务节点的状况好转后,可自动重连。