libuv8_process

关于Ubuntu中 E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable)解决方案 在中,有时候运用s安装软件时,会出现以下的情况在这个时候,主要是因为。 阅读详情

1. libuv-进程

1.1. 简介

  libuv提供子进程的管理工作,抽象平台的差异性,允许通过stream和pipe进行线程之间的交互

  unix建议每个进程只做一件事并且做好。所以一个进程常常使用多个子进程来完成各种任务,类似于shell中使用多个pipe。与线程共享内存类似,含有消息的多进程模型也很简单。

  基于事件的程序想利用现代计算机的多核功能是有一定挑战性的。在多线程程序里,内核可以通过调度把不同的线程分配到不同的系统核core上来提供core的利用率。但是libuv的loop只有一个线程,通过变通的使用多进程,每个进程上运行一个loop,每个进程关联到不同的core上以达到利用多核系统。

1.2. API

typedef enum {
  UV_IGNORE         = 0x00,
  UV_CREATE_PIPE    = 0x01,
  UV_INHERIT_FD     = 0x02,
  UV_INHERIT_STREAM = 0x04,

  UV_READABLE_PIPE  = 0x10,//只读 pipe, 前提是 UV_CREATE_PIPE 被设置
  UV_WRITABLE_PIPE  = 0x20,//只写 pipe, 前提是 UV_CREATE_PIPE 被设置

  UV_NONBLOCK_PIPE  = 0x40,//非阻塞 pipe, 前提是 UV_CREATE_PIPE 被设置
  UV_OVERLAPPED_PIPE = 0x40 /* old name, for compatibility */
} uv_stdio_flags;

typedef struct uv_stdio_container_s {
  uv_stdio_flags flags;

  union {
    uv_stream_t* stream;
    int fd;
  } data;
} uv_stdio_container_t;

enum uv_process_flags {
  UV_PROCESS_SETUID = (1 << 0),//手动设置 UID ,window无效
  UV_PROCESS_SETGID = (1 << 1),//手动设置 GID ,window无效

  UV_PROCESS_WINDOWS_VERBATIM_ARGUMENTS = (1 << 2),//参数不使用引号,并且没有任何转义,window专用
  
  UV_PROCESS_DETACHED = (1 << 3),//主子进程分离

  UV_PROCESS_WINDOWS_HIDE = (1 << 4),//window子进程隐藏创建
  UV_PROCESS_WINDOWS_HIDE_CONSOLE = (1 << 5),//window子进程隐藏 console
  UV_PROCESS_WINDOWS_HIDE_GUI = (1 << 6)//window子进程隐藏 gui
};
typedef struct uv_process_options_s {
  uv_exit_cb exit_cb; /* 回调*/
  const char* file;   /* 进程执行的可执行文件*/
  char** args; //参数,第一个参数必须同file,最后一个参数一NULL结束
  char** env;//环境变量,为NULL,继承父进程的环境变量。类似于 VAR=VALUE 格式的字符数组
  const char* cwd;//设置运行目录,默认是当前目录
  unsigned int flags;//具体详见 enum uv_process_flags,比如linux指定UID,GID,window隐藏console和GUI,detache等

  int stdio_count;
  uv_stdio_container_t* stdio;//指定 stdin,stdout,stderr

  uv_uid_t uid;//flags包含 UV_PROCESS_SETUID 时,手动指定uid,linux有效
  uv_gid_t gid;//flags包含 UV_PROCESS_SETGID 时,手动指定gid,linux有效
} uv_process_options_t;
//创建子进程
int uv_spawn(uv_loop_t* loop,
                       uv_process_t* handle,
                       const uv_process_options_t* options);
//杀掉子进程,如果调用uv_process_kill关闭进程的话,别忘记调用uv_close(handle)函数。
int uv_process_kill(uv_process_t* handle, int signum);
int uv_kill(int pid, int signum);//杀掉子进程
uv_pid_t uv_process_get_pid(const uv_process_t*);//获取子进程ID,实际就是 uv_process_t.pid

void uv_disable_stdio_inheritance(void)//此进程不继承父进程的文件及handle
  • signum
    • SIGINT : 程序终止(interrupt)信号, 在用户键入INTR字符(通常是Ctrl-C)时发出,用于通知前台进程组终止进程。
    • SIGQUIT : 和SIGINT类似, 但由QUIT字符(通常是Ctrl-)来控制. 进程在因收到SIGQUIT退出时会产生core文件, 在这个意义上类似于一个程序错误信号。
    • SIGTERM : 程序结束(terminate)信号, 与SIGKILL不同的是该信号可以被阻塞和处理。通常用来要求程序自己正常退出,shell命令kill缺省产生这个信号。如果进程终止不了,我们才会尝试SIGKILL。
    • SIGSTOP : 停止(stopped)进程的执行. 注意它和terminate以及interrupt的区别:该进程还未结束, 只是暂停执行. 本信号不能被阻塞, 处理或忽略.
    • …

1.3. 创建进程

使用uv_spawn来创建一个进程。代码如下:

int uv_spawn(uv_loop_t* loop,uv_process_t* handle,const uv_process_options_t* options);

uv_loop_t *loop;
uv_process_t child_req;
uv_process_options_t options;
void on_exit(uv_process_t *req, int64_t exit_status, int term_signal) {
    fprintf(stderr, "Process exited with status %" PRId64 ", signal %d\n", exit_status, term_signal);
    uv_close((uv_handle_t*) req, NULL);
}
int main() {
    loop = uv_default_loop();

    char* args[3];
    args[0] = "mkdir";
    args[1] = "test-dir";
    args[2] = NULL;

    options.exit_cb = on_exit;
    options.file = "mkdir";
    options.args = args;

    int r;
    if ((r = uv_spawn(loop, &child_req, &options))) {
        fprintf(stderr, "%s\n", uv_strerror(r));
        return 1;
    } else {
        fprintf(stderr, "Launched process with ID %d\n", child_req.pid);
    }

    return uv_run(loop, UV_RUN_DEFAULT);
}
  • options 必须被初始化位 0,上边代码因为 options 是全局的,所以默认会被置为 0.
  • args 的数组最后一个参数必须是 NULL。
  • 完成调用之后, uv_process_t.pid 包含的就是进程ID.
  • on_exit()在进程退出时,会触发。
  • 在进程运行前,可以改变参数 uv_process_options_t

1.4. 父子进程分离

  可以创建和父进程无关的子进程,使用UV_PROCESS_DETACHED标记。不受父进程的影响,父进程关闭不影响子进程的运行。可以用来写守候等不受父进程影响的子进程。举例如下:

int main() {
    loop = uv_default_loop();

    char* args[3];
    args[0] = "sleep";
    args[1] = "100";
    args[2] = NULL;

    options.exit_cb = NULL;
    options.file = "sleep";
    options.args = args;
    options.flags = UV_PROCESS_DETACHED;

    int r;
    if ((r = uv_spawn(loop, &child_req, &options))) {
        fprintf(stderr, "%s\n", uv_strerror(r));
        return 1;
    }
    fprintf(stderr, "Launched sleep with PID %d\n", child_req.pid);
    uv_unref((uv_handle_t*) &child_req);

    return uv_run(loop, UV_RUN_DEFAULT);
}

  虽然使用了UV_PROCESS_DETACHED,但是句柄还在父进程那里,如果想完全失去读子进程的控制,需要调用uv_unref接口,完全释放对子进程的控制。

1.5. 向进程发送信号

  在进程执行的过程中,可以通过发送信号来控制进程的执行。
  libuv针对Unix提供了一些信号,有些也适用于Windows.

struct uv_signal_s {
  UV_HANDLE_FIELDS
  uv_signal_cb signal_cb;
  int signum;
  UV_SIGNAL_PRIVATE_FIELDS
};
typedef void (*uv_signal_cb)(uv_signal_t* handle, int signum);
int uv_signal_init(uv_loop_t* loop, uv_signal_t* handle);
int uv_signal_start(uv_signal_t* handle, uv_signal_cb signal_cb, int signum);
int uv_signal_start_oneshot(uv_signal_t* handle, uv_signal_cb signal_cb, int signum);
int uv_signal_stop(uv_signal_t* handle);

  使用 uv_signal_init() 初始化,它与一个循环关联。要侦听该处理程序上的特定信号,使用 uv_signal_start() 处理程序函数。每个处理程序只能与一个信号编号相关联,连续调用 uv_signal_start() 后边的覆盖先前信号。使用 uv_signal_stop() 停止信号监听。

下边提供一个小例子供参考 signal例子

1.6. 子进程I/O

  子进程有其自身的一组文件描述符,用0,1和2的分别表示stdin,stdout和stderr。有时我们可能希望子进程与父进程共享文件描述符。libuv 支持继承文件描述符。

int main() {
    loop = uv_default_loop();

    options.stdio_count = 3;
    uv_stdio_container_t child_stdio[3];
    child_stdio[0].flags = UV_IGNORE;
    child_stdio[1].flags = UV_IGNORE;
    child_stdio[2].flags = UV_INHERIT_FD;
    child_stdio[2].data.fd = 2;
    options.stdio = child_stdio;

    options.exit_cb = on_exit;
    options.file = args[0];
    options.args = args;

    int r;
    if ((r = uv_spawn(loop, &child_req, &options))) {
        fprintf(stderr, "%s\n", uv_strerror(r));
        return 1;
    }

    return uv_run(loop, UV_RUN_DEFAULT);
}
  • UV_IGNORE 被重定向到/dev/null
  • UV_INHERIT_FD 继承父进程的I/O,需要在data.fd中,设置父进程的描述符。同理,子进程可以继承父进程的Stream,举例如下:
    args[1] = NULL;

    /* ... finding the executable path and setting up arguments ... */

    options.stdio_count = 3;
    uv_stdio_container_t child_stdio[3];
    child_stdio[0].flags = UV_IGNORE;
    child_stdio[1].flags = UV_INHERIT_STREAM;
    child_stdio[1].data.stream = (uv_stream_t*) client;
    child_stdio[2].flags = UV_IGNORE;
    options.stdio = child_stdio;

    options.exit_cb = cleanup_handles;
    options.file = args[0];
    options.args = args;

    // Set this so we can close the socket after the child process exits.
    child_req.data = (void*) client;
    int r;
    if ((r = uv_spawn(loop, &child_req, &options))) {
        fprintf(stderr, "%s\n", uv_strerror(r));

1.7. 管道

  管道不像linux下的符号“|”或者pipe,管道是用于两个进程之间进行通信的方法。具体如下:

  父子管道:父进程在创建子进程的时候 uv_spawn,可以通过设置 uv_stdio_container_t.flags 参数,来设置父子进程之间的单向或双向通信,uv_stdio_container_t.flags 可以是UV_CREATE_PIPE 、 UV_READABLE_PIPE or UV_WRITABLE_PIPE的一个或多个。可以同时设置多个,占不同的二进制位。UV_CREATE_PIPE 、 UV_READABLE_PIPE or UV_WRITABLE_PIPE 都是从子进程的角度来看。

void remove_sock(int sig) {//pipe-echo-server/main.c
    uv_fs_t req;
    uv_fs_unlink(loop, &req, PIPENAME, NULL);
    exit(0);
}

int main() {
    loop = uv_default_loop();

    uv_pipe_t server;
    uv_pipe_init(loop, &server, 0);

    signal(SIGINT, remove_sock);

    int r;
    if ((r = uv_pipe_bind(&server, PIPENAME))) {
        fprintf(stderr, "Bind error %s\n", uv_err_name(r));
        return 1;
    }
    if ((r = uv_listen((uv_stream_t*) &server, 128, on_new_connection))) {
        fprintf(stderr, "Listen error %s\n", uv_err_name(r));
        return 2;
    }
    return uv_run(loop, UV_RUN_DEFAULT);
}

1.8. 参考文章

  1. uv_process_t
Linux报错:Could not get lock /var/lib/dpkg/lock 如何解决? 这些错误提示大多是因为某些程序在系统后台进行着某些 apt 操作,因此锁定了 apt 数据库,所以暂时不能进行 apt 操作。就像windows上某程序或文件被另一进程所占有时,其他进程也无法访问一样,这是符合设计逻辑的。我们可以从结果中看到,该进程的 PID 为 2135,因此kill 掉这个进程。先找出是哪个进程占用了锁文件 /var/lib/dpkg/lock。 阅读详情

相关推荐

Linux常用的进程管理命令

这个命令可以管理systemd服务,可以通过指定不同的命令对服务进行启动、停止、重启等操作,也可以设置服务开机自启动和查看服务状态等信息。这个命令可以将本地的文件或目录拷贝到远程服务器上,也可以将远程服务器上的文件或目录拷贝到本地。这个命令可以查看指定systemd单元的状态信息,包括运行状态、启动时间、进程ID、日志等。这个命令也可以从指定的URL下载文件,并可以将下载的内容保存到指定的文件中。这个命令可以从指定的URL下载文件,并可以将下载的内容保存到指定的文件中。

qq_33993881的博客 2024

E: Could not get lock /var/lib/dpkg/lock-frontend - open (11: Resource temporarily unavailable)

问题详细提示如下: E: Could not get lock /var/lib/dpkg/lock-frontend - open (11: Resource temporarly unavailable) E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), is an other proces...

qq_40907977的博客 3652

node 单线程、多线程和多进程模型

node 单线程、多线程和多进程模型。

weixin_43294560的博客 2875

冷月手撕408之操作系统(5)-进程概述

操作系统的进程概述主要是介绍了进程的概念,进程的组成(进程实体)、进程的特征、进程的五状态模型、进程控制,其中重点掌握PCB、五状态模型及其状态转换。 主要的重点冷月做出了标识,知识点如下图(pdf版或xmind源文件请关注公众号:学长冷月,回复操作系统)。 冷月点睛 程序是静态的存储在计算机硬盘里面的计算机代码,而进程是程序在数据上的一次动态执行。 进程实体也叫进程映像,包括程序段、数据段、PCB。是进程的静态组成。 PCB,进程控制块,进程存在的唯一标识,常驻内存中。 进程最主要、最基本的特征是动态性

学长冷月的博客 2216

Part5-1-1 Nodejs 基础

Nodejs 架构 Natives modules 当前层内容由 JS 实现。 提供应用程序可直接调用库,例如 fs、path、http等。 JS 语言无法直接操作底层硬件设置。需要通过桥梁:Builtin modules "胶水层" (由C++编写)。 底层 V8:执行 JS 代码,提供桥梁接口。 Libuv: 事件循环、事件队列、异步IO 第三方模块:zlib、http、c-ares等。 Reactor模式 单线程完成多线程工作 实现异步IO、事件驱动 可以.

m0_38066007的博客 1307

GN算法边介数计算优化指南:如何提升大规模社交网络分析效率

本文深入探讨了GN算法在大规模社交网络分析中的核心瓶颈——边介数计算,并提供了从算法优化到工程部署的完整性能提升方案。通过引入Brandes算法、并行计算、增量更新及分布式处理等策略,有效解决了传统GN算法在处理百万级网络时效率低下的问题,为社交网络社区划分等实际应用提供了高效解决方案。

weixin_29196613的博客 486

HoRain云--Node.js 工作机制

事件驱动的编程模型非阻塞 I/O 操作单线程但支持多进程/多线程扩展高效的事件循环调度理解这些机制对于编写高性能的 Node.js 应用至关重要。通过合理利用其异步特性,可以构建出能够处理高并发的网络应用。❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄👍 👍 👍🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙。

sinat_57153473的博客 167

嵌入式C开发必备:用Cursor规则搞定代码风格检查(附Pikachu项目实战)

本文以Pikachu开源项目为例,详细介绍了如何利用Cursor的AI代理规则系统,为嵌入式C开发项目配置一套完整的代码风格检查与规范执行方案。通过实战演示,指导开发者创建项目级规则,实现命名、格式、硬件抽象层及驱动开发的自动化规范,从而提升代码一致性、可维护性和团队协作效率。

weixin_29181861的博客 599

探索Node.js版本信息:深入了解process.versions属性

是 Node.js 中的一个全局对象属性,它返回一个对象,该对象包含了 Node.js 及其依赖的各个模块的版本信息。通过访问这个属性,你可以获取到当前 Node.js 进程使用的各种组件的版本号。以下是关于。

809

ios快捷指令进行钉钉打卡

首先 1、打开快捷指令 2、自动化 3、创建个人自动化-特定时间 4、添加操作-搜索“随机数” 5、最小值和最大值填充 6、添加操作-搜索“等待” 7、长按“1秒钟”,选择魔法变量,选择上一步的随机数 6、添加操作-搜索“钉钉” 7、选择钉钉-随便一个聊天窗口。 8、添加操作-搜索“等待”,这次将等待时间设为10秒 9、添加操作 “搜索天气” ,选择显示天气。 注意点: 1、此操作依赖于钉钉极速打卡,只是帮忙唤起钉钉。 2、保存自动化时有个运行前询问,务必关掉。 3、手机不能设

blaze_jack 5万+

基于libVLC的视频播放器之四:直接使用libVLC

一.效果 播放本地文件 播放网络url:rtsp://3.84.6.190/vod/mp4:BigBuckBunny_115k.mov 二.实现 既然有VLC-Qt,为什么还要直接调用libVLC呢,因为直接调用会加深对整个播放流程的理解,方便后面修改VLC-Qt源码。 注意事项: 1.编译报错:error C2065: “libvlc_media_read_cb”: 未声明的标识符。修改如下: 2.libvlc_new(0, nullptr)返回null 将plugins

草上爬的博客 5049

前端高手进阶第25讲:Node.j == 全栈?

libuv 是一个用 C 编写的支持多平台的异步 I/O 库,主要解决 I/O 操作容易引起阻塞的问题。最开始是专门为 Node.js 使用而开发的,但后来也被 Luvit、Julia、pyuv 等其他模块使用。下图是 libuv 的结构图。libuv 结构图我用黄色线框将图中模块分为了两部分,分别代表了两种不同的异步实现方式。

sucaiwa的博客 241

Ubuntu24.04安装搜狗输入法详细教程

本章教程,介绍如何在Ubuntu24.04版本操作系统上安装搜狗输入法。

猿小白的博客 1万+

nodejs源码—初始化

概述 相信很多的人,每天在终端不止一遍的执行着node这条命令,对于很多人来说,它就像一个黑盒,并不知道背后到底发生了什么,本文将会为大家揭开这个神秘的面纱,由于本人水平有限,所以只是讲一个大概其,主要关注的过程就是node模块的初始化,event loop和v8的部分基本没有深入,这些部分可以关注一下我以后的文章。(提示本文非常的长,希望大家不要看烦~) 本文node基于10.5.0 node是...

weixin_34405557的博客 107

极验验证码: 一点即过验证(鼠标轨迹分析)

2、第一个验证接口分析(第一个w值还原) 3、第二个验证接口(第二个w值还原)这里定位w生成跟上篇文章一样,就不展开了;主要分析tt值(鼠标轨迹)的生成逻辑

qq_49268524的博客 1010

模糊控制 (Fuzzy Control) 算法详解及案例分析

模糊控制是一种基于模糊逻辑的控制策略,其核心思想是通过模糊规则和模糊推理实现对复杂系统的控制。模糊控制不依赖于精确的数学模型,而是通过模拟人类的决策过程来处理不确定性和非线性问题。

闲人编程的博客 3658

深入理解 Node.js 事件循环:从 libuv 线程池到 epoll 系统调用

![Node.js 事件循环与 libuv 全景架构图](/uploads/1786000202553-dggynf.png) # 深入理解 Node.js 事件循环:从 libuv 线程池到 epoll 系统调用 > 配图:Node.js 事件循环全景架构图(调用栈 / libuv 线程池 / 内核事件机制) ## 引言 "事件循环"是 Node.js 最常被提及的概念之一,但大部分人的理解停留在「setTimeout 和 Promise 哪个先执行」的层面。本文将追到底层源码与操作系统层面,剖析 Nod

gswjc的博客 177

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Node.js中的Event Loop

Node.js是单线程的Event Loop,但是它的运行机制不同于浏览器环境。 Node.js的运行机制如下。 (1)V8引擎解析JavaScript脚本。 (2)解析后的代码,调用Node API。 (3)libuv库负责Node API的执行。它将不同的任务分配给不同的线程,形成一个Event Loop(事件循环),以异步的方式将任务的执行结果返回给V8引擎。 (4)V8引擎再将结果返回给...

wyw223的博客 195

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

js判断定时器是否启动_Node.js 如何利用 Libuv 实现事件循环和异步

本文主要从以下四个方面进行讲解:Nodejs 是什么?Libuv 的工作原理Nodejs 的工作原理Nodejs 如何使用 Libuv 实现事件循环和异步正文从下面开始~1. Nodejs 是什么?Nodejs 是对 js 功能的拓展。提供了网络、文件、dns 解析、进程线程等功能。1.1 Nodejs 是如何拓展 js 功能的?利用 v8 提供的接口。1.2 如何在 v8 新建一个自定...

weixin_39625337的博客 190

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Node.js 的Event loop

V8引擎 V8是JavaScript引擎实现,被谷歌收购,V8使用C++开发,V8将其编译成原声机器码,使用内联缓存等方法提高性能 Node.js 的Event loop Node.js的运行机制: (1)V8引擎解析JavaScript脚本。 (2)解析后的代码调用 Node API (3)libuv库负责Node API 的执行。它将不同的任务分配给不同的线程,形成一个事件循环,以...

Vivi4478的博客 259

nodejs代码初探之nodejs启动

nodejs启动 入口在node_main.cc,解析参数后进入node.cc 中的node::Start() V8::Initialize() //初始化v8SetupProcessObject() //在v8中创建process对象Load() //bootstrap,加载执行node.jsuv_run() ...

weixin_30379911的博客 262

nodejs大前端从入门到精通一

Natives Modules - 当前层内容由JS实现 - 提供应用程序可直接调用库,例如fs、path、http等 - JS语文无法直接操作底层硬件设置 在和硬件交互的的桥梁,通过Builtin Modules(胶水层) 底层: - V8:执行JS代码,提供桥梁接口 - Libuv:事件循环、事件队列、异步IO - 第三方模块:zlib、http、c-ares等

山有木兮的博客 1292

Node环境的事件循环

浏览器与Node事件循环有何区别?这么通俗易懂的Node事件循环,背就完了Node 中的 Event Loop 和浏览器中的是完全不相同的东西。Node.js采用V8作为js的解析引擎,而I/O处理方面使用了自己设计的libuv,libuv是一个基于事件驱动的跨平台抽象层,封装了不同操作系统一些底层特性,对外提供统一的API,事件循环机制也是它里面的实现。

HBR666_的博客 1189

【Node.js】入门指南 - 1

的基本要求,在实习或秋招中通常也会对大家的Node.js有一定要求,所以Node.js或多或少都是有所了解。如果我们编写一个js文件,里面存放JavaScript代码,如何来执行它呢?但是,在某些情况下执行node程序的过程中,我们可能希望给node传递一些参数。如果我们这样来使用程序,就意味着我们需要在程序中获取到传递的参数。正常情况下执行一个node程序,直接跟上我们对应的文件即可。模块中的变量,只是每个模块都有,看起来像是全局变量。如果我们希望把js文件交给node执行。安装nvm后,几个命令。

qq_52354024的博客 298

Node.js 基础

NodeJs可以做什么?轻量级、高性能的web服务器前后端javsscript同构开发便捷高效的前端工程化Nodejs 慢慢演化为了一门服务端“语言”IO是计算机操作过程中最缓慢的环节Reactor模式,单线程完成多线程工作Reactor模式下实现异步IO、事件驱动Nodejs更适用于IO密集型高并发请求。

woyebuzhidao321的博客 240
上一篇: libuv7_thread
下一篇: libuv9_常用结构
knowledgebao
博客等级 码龄15年 401粉丝 198原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值