分类 编程 中的文章

Golang | sync.Mutex详解

概述

自己做的一个golang项目需要优化,优化方向是减少gpu内存的使用。同一个模型被重复加载多次,使用更多的gpu内存,也增加 sync.Mutex的使用。
优化的方向是:

  • 减少代码量的改动- 减少gpu内存的使用,同一个模型只用加载一次 涉及的问题:
  • sync.Mutex是传值还是传引用?- sync.Mutex可以拷贝么?- sync.Mutex需要申明为指针么?

sync.Mutex是传值还是传引用?

查看一个例子

……

阅读全文

五种网络IO模型总结

概述

在网络上看到很多关于阻塞IO、非阻塞IO、同步IO、异步IO的例子,总觉得写的过于复杂并且让人难以理解。于是我把我自己把这几个概念的理解写下来以供参考。

POSIX

POSIX(可移植操作系统接口)把同步IO操作定义为导致进程阻塞直到IO完成的操作,反之则是异步IO

……

阅读全文

CCnet | 一个reactor单线程网络库

缘由

最近在研究陈硕的网络库muduo,是一个基于reactor架构的网络库。我对网络库的感觉是易用,但是内容庞大,依赖颇多。比如boost网络库里面的一些语法让人生畏。关于reactor和proactor架构,还有select/poll/epoll网络模型方面的基础理论知识已经掌握,自己也一直想做一个网络库来对自己之前工作的一个总结。muduo整体代码量不多,易读,整个架构也容易理解,于是我模仿muduo写了一个单线程的reactor网络库。

……

阅读全文

C++ | vector中的resize()函数 VS reserve()函数

reserve

void reserve (size_type n);

reserver函数用来给vector预分配存储区大小,即capacity的值 ,但是没有给这段内存进行初始化。reserve 的参数n是推荐预分配内存的大小,实际分配的可能等于或大于这个值,即n大于capacity的值,就会reallocate内存 capacity的值会大于或者等于n 。这样,当ector调用push_back函数使得size 超过原来的默认分配的capacity值时 避免了内存重分配开销。

……

阅读全文

Golang | 用gocolly登录B站

概述

gocolly是golang语言开发的爬虫包,通过gocolly来进行模拟网站的登录,
目标已经确立,开始行动。

下载

$ go get -u github.com/gocolly/colly

获取cookie

登录网站:https://www.bilibili.com/
获取cookie:

……

阅读全文

Protobuf | 沾包问题

缘由

最近在研究一款游戏的源码。发现里面的通信协议是protobuf定义的,但还是自己定义了协议头部,类似 head + body。先解析头部里所存储的整个包的数据长度,然后再解析包剩余的数据,这样做的目的是为了防止沾包。我在想都用了protobuf了为啥不直接用grpc呢。一时想不出,于是我用golnag + protobuf 做了一个简单的client + server

……

阅读全文

Grpc | 概述

OverView

gRPC是由Google主导开发的RPC框架,使用HTTP/2协议并用ProtoBuf作为序列化工具。其客户端提供Objective-C、Java接口,服务器侧则有Java、Golang、C++等接口,从而为移动端(iOS/Androi)到服务器端通讯提供了一种解决方案。 当然在当下的环境下,这种解决方案更热门的方式是RESTFull API接口。该方式需要自己去选择编码方式、服务器架构、自己搭建框架(JSON-RPC)。gRPC官方对REST的声音是:

……

阅读全文

Openresty二 | postman小工具

用到的知识点

mvc架构
模型渲染库:https://github.com/bungle/lua-resty-template
resty http请求库: https://github.com/bungle/lua-resty-template

参照 mvc模型来做postman工具

配置文件说明

worker_processes  1;
error_log logs/error.log;
events {
    worker_connections 1024;
}
http {
    lua_package_path "/open_resty/lualib/?.lua;/usr/local/openresty/lualib/?.lua;";
    server {
        listen 8080;
        default_type 'application/json;charset=utf8';
        lua_code_cache off;

        location /  {
            content_by_lua_file mvc.lua;
        }

        location ~ ^/js/|^/css/|\.html {
            root static;
        }
    }
}
  • lua_code_cache off; 是为了修改lua脚本后不用重启nginx自动加载lua。- lua_package_path: lua脚本路径- root static: 静态目录是static

入口文件/解析uri

mvc.lua

……

阅读全文

Openresty一 | 初探

概述

OpenResty®是一个基于Nginx与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

OpenResty®通过汇聚各种设计精良的Nginx模块(主要由 OpenResty 团队自主开发),从而将Nginx有效地变成一个强大的通用 Web 应用平台。这样,Web 开发人员和系统工程师可以使用 Lua 脚本语言调动Nginx支持的各种 C 以及 Lua 模块,快速构造出足以胜任 10K 乃至 1000K 以上单机并发连接的高性能 Web 应用系统。

……

阅读全文

LastBattle | 登录流程(LS & BS & GS)

登录流程

根据上一篇文章中的登录流程,我在工程中找到了相应的代码并记录了下来

登录服务代码解析

监听端口:49997 供BS服务连接
监听端口:49996 供客户端连接

CIocpCtrl:IOCP控制类

多线程循环查询IOCP内部的网络事件,并分派处理.这里多个工作线程仅仅是将所有的网络事件放入循环
内部将创建2 * CPU个工作线程(Worker Item).
多线程调用函数

……

阅读全文