架构设计分析:进程重要还是线程重要?

Envoy 与 Nginx 的对比 摘要:Envoy与Nginx在云原生时代代表不同技术路线。Nginx以静态配置、低资源占用见长,适合传统Web服务与简单负载均衡;而Envoy基于动态xDS协议,支持零中断热更新,是服务网格(如Istio)的核心组件,擅长云原生场景的细粒度流量治理和现代协议(如gRPC)支持。性能上,Nginx在四层代理和静态内容处理占优,Envoy则在复杂七层逻辑和扩展性(如WASM)更高效。选型需权衡稳定性与动态需求:传统架构选Nginx,云原生生态优先Envoy。两者持续演进,Nginx强化动态能力,Envoy扩展A 阅读详情

就像莎士比亚的"To be, or not to be, that is the question"始终困扰着哈姆雷特,对于"进程还是线程?"这个问题,也经常困扰着那些进行软件架构设计的家伙。所以今天打算聊一下我对这个问题的体 会。假如你还搞不清楚线程和进程的区别,请先找本操作系统原理的书好好拜读一下,再回来看帖。


由于这个问题很容易引发口水战,事先声明如下:多进程和多线程,无法一概而论地说谁比谁好。因此本帖主要描述特定场景(与我所负责的产品相关)下,进程和线程的权衡经验,仅供大伙儿参考。


由于特定场景是本帖讨论的前提,先说说我目前负责的产品的特点:业务逻辑比较复杂、业务数据量比较大、对数据实时处理的性能要求比较高、对健壮性和安全性要求比较高、要求跨平台(包括操作系统、数据库)、某些情况下需要分布部署。


上面说了一大堆,其实有不少的应用系统符合上述特点,比如:某些网络游戏服务器、某些金融行业的业务系统、某些电子商务的交易系统等等。如果你正在从事的是类似的应用系统的设计,希望我下面介绍的经验对你有帮助。


进程颗粒度问题


大伙儿应该明白,进程和线程都是处理并发(concurrency)的手段。对于上述这种比较复杂的系统,如果你企图全部用进程(见注1) 或者全部用线程(见注2)来处理并发,估计会死得很难看。所以,关键问题就是如何在进程和线程之间进行平衡(也就是确定进程颗粒度的问题)。


我个人建议,尽量以业务逻辑的单元来划分进程。这样做的好处有如下几点:


1、避免扯皮


一般来说,某个固定业务逻辑的开发人员也是相对固定的。如果业务逻辑对应的某个进程崩溃了,测试人员容易快速定位肇事者,然后直接提交Bug给他/她。


反之,一个进程搞得太庞大,N多人掺和在里面,一旦进程崩溃了,相关编程人员之间很容易互相扯皮,不利于维护安定团结的局面;另外,由于测试人员经常搞不清楚Bug属于谁,经常给错Bug,也容易制造人民内部矛盾。


从上面可以看出来,相对细的进程颗粒度能够避免一些管理上的麻烦。由于XXX经常教导我们:"稳定压倒一切",所以该优点列第一条。


2、健壮性、容错性


一般来说,开发人员的水平参差不齐,优秀的毕竟是少数(具体参见"二八原理系列"的帖子)。所以难免会有菜鸟程序员搞出低级错误,而有些低级错误是致命的,会导致进程的崩溃。


如果你是以业务逻辑划分进程,一个业务逻辑的进程崩溃,对其它业务逻辑的影响不大(除非是该业务逻辑的依赖方);因此就不会出现"注2"提到的问题。


3、分布式


我常碰见的分布式部署需求,一般都是按照业务逻辑的维度来划分。比如系统中有一个认证模块,里面包含有敏感的用户认证信息。这时候客户就会要求把该模块单独部署在一台经过安全加固的主机中(以防阶级敌人搞破坏)。


如果是以业务逻辑为单位划分进程,要满足上述的部署需求就相对容易了(只要再配合恰当的进程间通讯机制,下面会提到)。


另外,支持分布式部署还可以顺带解决性能问题。比如某个业务逻辑模块特别消耗硬件资源(比如内存、CPU、硬盘、带宽),就可以把它拿出去单独放一台机器上跑。


4、跨编程语言


这个好处可能很多人容易忽略。一般来说,每个编程语言都有各自的优缺点。如果你通过业务逻辑划分进程,就可以根据不同的业务逻辑的特点来选择合适的编程语言。


比如:对于性能敏感的模块,我就使用C++搞定;而对于一些业务逻辑密集型的模块,则使用Java或Python开发。


进程间通讯(以下简称IPC)问题


既然不可能把整个系统放入一个进程,那就必然会碰到IPC的问题。下面就来说一下该如何选择IPC。


各种操作系统里面,有很多稀奇古怪的IPC类型。由于要考虑跨平台,首先砍掉一批(关于IPC的跨平台问题,我在"跨平台开发"系列中会提到)。剩下的 IPC类型中,能够进行数据传输的IPC就不多了,主要有如下几种:套接字(以下简称Socket)、共享内存、管道、文件。


其中Socket是我强烈推荐的IPC方式,理由如下:使用Socket可以天然地支持分布式部署;使用Socket可以比较容易地实现多种编程语言的混 合(比如C++、Java、Python、Flex都支持Socket);使用Socket还可以省掉了一大坨"锁操作"的代码。


列位看官中,或许有人在担心Socket的性能问题,其实大可不必多虑。当两个进程在本机上进行Socket通讯时,由于可以使用localhost环回 地址,数据不用经过物理网卡,操作系统内核还可以进行某些优化。这种情况下,Socket相对其它几种IPC机制,不会有太大的性能偏差。


最后再补充一下,Socket方式也可以有效防止扯皮问题。举个例子:张三写了一个进程A,李四写了一个进程B,进程A通过Socket方式发数据给进程 B。突然有一天,两个进程的通讯出故障了。然后张三就说是李四接收数据出错;李四就说张三发送数据出错。这时候怎么办捏?很简单,随便找个Sniffer 软件当场抓一下数据包并Dump出来看,问题就水落石出了。


为啥还要线程?


上面说了这么多进程的好处,有同学要问了:"那线程有什么用捏?"总的来说,使用线程出于两方面的考虑:性能因素和编码方便。


1、性能因素


由于某些操作系统(比如Windows)中的进程比较重型,如果频繁创建进程或者创建大量进程,会导致操作系统的负载过高。举例如下:


假设你要开发一个类似Web Server的应用。你针对每一个客户端请求创建一个对应的进程用于进行数据交互(是不是想起了古老的CGI :-)。一旦这个系统扩容,用户的并发连接数一增加,你的应用立马死翘翘。


上面的例子表明,跨平台软件系统的进程数要保持相对稳定。如果你的进程数会随着某些环境因素呈线性增长,那就相当不妙了(顺带说一下,如果线程数会随着环境因素呈线性增长,也相当不妙)。而根据业务逻辑的单元划分进程,顺便能达到"进程数的相对稳定"的效果。


2、编码方面


由于业务逻辑内部的数据耦合比较紧密。如果业务逻辑内部的并发也用进程来实现,可能会导致大量的IPC编码(任意两个进程之间只要有数据交互,就得写一坨IPC代码)。这或许会让相关的编程人员怨声载道。


当然,编码方面的问题也不是绝对的。假如你的系统有很成熟且方便易用的IPC库,可以比较透明地封装IPC相关操作,那这方面的问题也就不存在了。

尝试使用CubeMX做stm32开发之九:SYS配置 参考《STM32中文参考手册_V10》,研究CubeMX中有关SYS的配置 阅读详情

相关推荐

在带有Intel Arc GPU的Windows上安装IPEX-LLM

本文将介绍在 Intel Arc GPU 环境下安装 IPEX-LLM。

wux_labs的博客 1634

架构设计:进程还是线程?是一个问题!

就像莎士比亚的“To be, or not to be, that is the question”始终困扰着哈姆雷特,对于“进程还是线程?”这个问题,也经常困扰着那些进行软件架构设计的家伙。所以今天打算聊一下我对这个问题的体会。假如你还搞不清楚线程和进程的区别,请先找本操作系统原理的书好好拜读一下,再回来看帖。由于这个问题很容易引发口水战,事先声明如下:多进程和多线程,无法一概而论地说谁

kadas的专栏 311

IBIS模型中的Pullup和Pulldown曲线详解:如何避免信号完整性设计中的常见错误

本文深入解析IBIS模型中Pullup和Pulldown曲线的关键作用,揭示其在信号完整性设计中的黄金法则。通过详细分析曲线特性、常见误区及验证方法,帮助工程师避免设计错误,优化高速PCB设计。文章还展示了曲线数据在动态终端匹配、串扰预测和电源完整性分析中的高级应用,提升设计效率和可靠性。

weixin_30275415的博客 450

【操作系统】进程 与 线程 详解(以及二者的比较)

【操作系统】进程 与 线程 详解(以及二者的比较)

xqs196301的博客 860

打通Creo与Matlab的桥梁:Simscape Multibody Link插件安装与配置全攻略

本文详细介绍了Simscape Multibody Link插件的安装与配置全流程,旨在帮助机械工程师和开发者打通Creo与Matlab/Simulink之间的桥梁,实现CAD模型到多体动力学仿真的高效转换。文章重点解析了版本兼容性、管理员权限、注册文件配置等关键步骤与常见故障排查方法,助力用户快速建立设计与仿真一体化工作流。

rrr55的博客 634

基于 Datawhale 开源量化投资学习指南(10):基于 LightGBM 的量化选股

通过本篇文章,我们深入探索了如何运用 LightGBM 机器学习模型实现量化选股。首先,我们通过获取股票的历史数据,进行特征工程和标签制作,将选股问题转化为一个分类问题。接着,我们使用 LightGBM 训练模型,并在验证集和测试集中评估了模型的表现。该选股策略的核心在于结合机器学习算法,从历史数据中寻找能够捕捉股票短期涨跌的关键特征,从而为投资者提供辅助决策支持。虽然本文的模型取得了一定的效果,但这只是量化投资领域的一小部分。

不想宅的冷同学 1346

多线程的类型

1 交错/临时多线程 (1)粗粒度多线程: 在一个线程运行到被一个通常会造成长延迟停顿的事件阻塞时,就会发生最简单类型的多线程。这种停滞可能必须访问片外存储器来弥补高速缓存的缺失,数据返回可能需要数百个CPU周期。线程处理器会在不等待停顿解决的情况下执行切换到另一个准备运行的线程。只有当前一个线程的数据到达时,前一个线程才会被放回到准备运行的线程列表中。 例如: 周期i:线程A发出指令j。 周期i + 1:线程A发出指令j + 1。 周期i + 2:线程A发出指令j + 2,这是一个在所有高速缓存中未被执行

iPwisdom的博客 1961

汇川Easy系列PLC系统PID指令编程应用(增量型)

增量式PIDS7-1200/1500增量式PID(输出归一化、支持PWM输出)_西门子1200pid算法公式-优快云博客文章浏览阅读1k次。本文介绍了S7-1200/1500 PLC中增量式PID算法的应用,包括输出归一化和PWM输出。通过详细解析,阐述了PID输出如何限制在0.0-1.0之间,并且如何将PID输出与PWM占空比关联,适用于温度等控制场景。

RXXW_Dor的博客 1422

Linux编程:模拟进程调度算法

稍稍有点操作系统基础的朋友应该知道进程的调度算法,在这里Koala还是给大家略微介绍一下接下来将要用到的几种算法: 先来先服务(FCFS) 采用FCFS调度,先请求CPU的进程会先分配到CPU。 使用FCFS调度的等待时间通常较长,CPU利用率也会较低 最短作业优先调度(SJF) 采用SJF调度会选择具有最短CPU运行时间的进程分配CPU使用权。如果两个进程的CPU区间相同,则按照FCFS来进

考拉研究僧的博客 8782

深入解析逆时偏移(RTM)算法及其在C++中的实现

逆时偏移(Reverse Time Migration, RTM)是一种高级地震成像技术,广泛应用于地震勘探中。RTM通过逆时传播波场来构建地震子波,能够提供更高分辨率和更精确的地下构造图像。本文将详细介绍RTM的基本原理,并通过C++代码示例,深入解析如何实现和优化RTM算法。希望这篇文章能够为地球物理学家和C++开发者提供有价值的参考。

qq_38334677的博客 1526

ubuntu-25.04-desktop-amd64 工具VMware-tools 正确安装方法

摘要:Ubuntu 25.04虚拟机安装VMware Tools后无法实现主机与虚拟机间的文件复制粘贴和拖拽功能,问题可能源于工具兼容性。建议优先安装open-vm-tools套件(含open-vm-tools-desktop),而非官方VMware Tools。具体方案:通过终端执行安装命令后重启系统。该方法已实测有效解决该兼容性问题。(149字)

安徽锐锋科技-沐雨潇竹 672

多线程

进程进程是资源(CPU、内存等)分配的基本单位,它是程序执行时的一个实例。程序运行时系统就会创建一个进程,并为它分配资源,然后把该进程放入进程就绪队列,进程调度器选中它的时候就会为它分配CPU时间,程序开始真正运行。2. 线程线程是一条执行路径,是程序执行时的最小单位,它是进程的一个执行流,是CPU调度和分派的基本单位,一个进程可以由很多个线程组成,线程间共享进程的所有资源,每个线程有自...

weixin_30493401的博客 237

Vue - 列表拖曳排序 / 鼠标拖动改变顺序排列高效简洁组件(支持PC端与移动端触屏拖动,也可在滚动条内排序自动滚动,流畅丝滑无 BUG)

Vue-高效简洁列表拖曳排序/鼠标拖动改变顺序排列组件支持PC端与移动端触屏拖动,也可在滚动条内排序自动滚动,流畅丝滑无BUG列表拖曳排序插件vuedraggable拉动拽动拖动顺序改变排序js,vue.js,nuxt.js列表如何实现鼠标拖曳改变顺序排列支持滚动条内复杂数据对象带拖动效果动画排序完毕自动排列数组位置克隆Vue.Draggable官方文档教程SortableJS与vuedraggable列表拖动排序Vue拖拽组件库vuedraggable的安装与使用用户用鼠标拖动排序功能源码最好

🏆 前端领域优质创作者 4847

多进程并行化BPE分词器实现:从算法原理到工程优化

在自然语言处理(NLP)领域,子词分词是文本预处理的核心环节,它通过将单词拆分为更小的语义单元,有效解决了未登录词问题并平衡了词典大小。Byte Pair Encoding(BPE)作为主流子词分词算法,其原理基于统计高频字节对并进行迭代合并,从而构建出适应特定语料的词汇表。该技术的核心价值在于为BERT、GPT等前沿预训练模型提供了高效、可扩展的词汇表示基础。在实际工程实践中,面对大规模语料时,单线程BPE训练常因全局频率统计的计算密集型特性成为性能瓶颈。通过引入多进程并行化架构,可将语料分片、并行统计与

weixin_31742871的博客 272

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

架构设计:进程还是线程?

引自编程随想的博客,链接如下:https://program-think.blogspot.com/2009/02/multi-process-vs-multi-thread.html文章目录★进程【颗粒度】问题★“以业务逻辑为单元”划分进程的好处★进程间通讯(以下简称 IPC)问题★为啥还要线程?  就像莎士比亚的“To be, or not to be, that is the questio...

Howie66的博客 333

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

进程、线程与协程傻傻分不清?一文带你吃透!

前言 欢迎来到操作系统系列,依然采用图解 + 大白话的形式来讲解,让小白也能看懂,帮助大家快速科普入门 本篇开始介绍进程、线程、协程,相信很多小白们对这几个概念理解的不清晰,这里全部给你们安排的明明白白,我们开始进入正文吧 内容大纲 小故事 小明(操作系统)开了一家互联网小公司,因为准备同时开发A与B两个软件,所以小明请了两个开发团队来做这件事情,分别是小王开发团队与小李开发团队,可是公司特别小,不仅只有一个房间(C P U),而且房间(C P U)只能容纳一个开发团队,为了能两个软件开发不被耽误,小

程序猿阿星 6048

深度学习工具包 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")

高级工程师的日常 | 模块架构设计时,到底该选多进程还是多线程?

本文探讨了银行API对接模块的架构选型问题。通过对业务特点分析(低并发、高可靠性需求、第三方接口风险),对比了多进程与多线程的优缺点。多线程虽然性能更优,但存在单点故障风险;而多进程具备更好的隔离性和容错能力,能有效防范银行SDK的潜在问题。最终建议采用多进程方案,确保资金流转系统的稳定性。该案例展示了架构设计需以业务需求为导向,在关键系统中应优先保障可靠性而非性能。

2401_84703565的博客 976

多进程和多线程

什么是多线程: <br /><br />多线程是为了使得多个线程并行的工作以完成多项任务,以提高系统的效率。线程是在同一时间需要完成多项任务的时候被实现的。 <br /><br />使用线程的好处有以下几点: <br /><br />·使用线程可以把占据长时间的程序中的任务放到后台去处理 <br /><br />·用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度 <br /><br />·程序的运行速度可能加快 <br /><br />·在一些等待的

HTTP 404 1767

深入解析 JDK jstack 命令:线程分析的利器

jstack是 Java 开发者必须掌握的诊断工具,能够快速定位线程相关的问题。生成和分析线程转储。诊断死锁、CPU 占用过高、线程阻塞等常见问题。使用高级工具优化分析效率。

专注分享原创技术干货。大厂资深架构师,多年技术架构与技术管理经验,多年面试官经验。一对一技术指导培训,带你从小白到入门到架构设计到技术管理。关注我,免费领取学习资料。一对一免费面试指导,快速拿offer。 2090

架构设计:进程还是线程?是一个问题!(转载)

 就像莎士比亚的“To be, or not to be, that is the question”始终困扰着哈姆雷特,对于“进程还是线程?”这个问题,也经常困扰着那些进行软件架构设计的家伙。所以今天打算聊一下我对这个问题的体 会。假如你还搞不清楚线程和进程的区别,请先找本操作系统原理的书好好拜读一下,再回来看帖。  由于这个问题很容易引发口水战,事先声明如下:多进程和多线程,无法一概而论地...

weixin_33895657的博客 188

【操作系统】进程和线程的Java代码实现

本文实现了一个基于Java的简易操作系统模拟器,采用六层架构设计,包含进程线程管理、IPC通信和CPU调度三大核心功能。系统通过状态枚举层、基础数据结构层、IPC机制层、实体层、内核层和测试层协同工作,实现了进程创建/终止、线程调度、管道和共享内存通信等功能。关键改进包括:使用LinkedList实现子进程线程优先调度、ReentrantLock保证线程安全、Java Stream API简化状态判断。

2401_84149564的博客 777

架构设计011 多任务进程线程协程

pass

ailinyingai的博客 199

11 | 多任务:进程、线程与协程

今天我们重点介绍了多任务,以及多任务带来的复杂需求,由此介绍了进程、线程和协程等三套执行体的设计。后面我们还会分进程内和进程间来介绍进程的通讯机制。执行体的设计,有非常多值得反思的地方。UNIX 的 fork API 是否是一个好的设计?线程的设计是否成功?如果线程的设计是优良的,是不是就不再有 Go 语言这种在用户态重造执行体和 IO 子系统的必要性?

qq_37756660的博客 1291

年薪百万第N步[特殊字符] 深入解析 Java 中的进程、线程与协程(虚拟线程)

在 Java 中,每次启动一个 JVM 实例,系统就会分配一个独立的操作系统进程(Process)。JVM 进程中的所有资源(堆、方法区、线程栈等)都受该进程调度与资源控制。问题点说明启动成本高每个线程分配独立栈内存(默认 1M 左右)切换代价大需陷入内核态切换,频繁调度性能下降数量限制强单机难以支持百万线程,容易 OOM虚拟线程是由JVM 而非操作系统调度的用户态线程。它们被挂载在少数平台线程(Carrier Thread)上复用执行。

2301_80320652的博客 1235

从守护进程到异步协作:kthreadd如何重塑Linux内核线程创建模式

本文深入探讨了Linux内核中kthreadd守护进程如何通过异步协作机制重塑内核线程创建模式。kthreadd将传统的同步阻塞式线程创建转为异步处理,显著降低了创建延迟并提高了系统吞吐量,特别适用于高并发服务器环境。文章详细解析了kthread_create的实现原理、完成量同步机制及其在现代Linux系统中的性能优势和应用价值。

pz8901234的博客 808

高并发服务器开发:多进程与多线程实现深度解析

本文深入解析高并发服务器的多进程与多线程实现方案。通过对比单线程服务器的性能瓶颈,详细阐述两种并发模型的架构设计、关键代码实现和优化技巧。多进程模型隔离性好但资源消耗高,多线程模型效率更优但需注意线程安全。文章提供决策树指导技术选型,并针对计算密集型和IO密集型等不同场景给出推荐方案,同时指出僵尸进程、线程安全等常见问题的解决方案,为开发者构建高性能服务器提供实用指南。

软件科学-郝学胜 1125
上一篇: Socket API 隐患
下一篇: 在外部结束线程
lbjfeng
博客等级 码龄19年 38粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值