多进程

「Python网络编程」再识多任务的真面目/多进程(三)

南楼画角 提交于 2020-01-22 00:25:02
博主前言: 上篇博客我讲述了多任务的一种实现方式—多线程。这篇博客我继续讲述使用进程的方式来实现多任务。由于进程的知识实属有点抽象,特别是结合线程来讲进程确实有点难度,所以在本篇博客开写之前,我借阅了多个论坛大佬写的有关于多进程的博客,所以这篇博客如有雷同,算我抄你的。但是我保证,百分之一大半都是自己理解所得。 1. 多进程 在「Python网络编程」系列第一篇博客讲端口号时,我们了解了有关进程的概念。 进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动,是操作系统分配资源的基本单元,是操作系统结构的基础。 如果你觉得上段黑体字有点难以理解,那么你可以就把进程理解为运行着的程序也可。程序与进程的区别就是: 程序是静态的,进程是动态的。 我在网上看到一个公式觉得非常精辟: 进程 = 程序 + 资源 1.1 进程的状态 1)就绪状态(Ready): 进程已获得除处理器外的所需资源,等待分配处理器资源;只要分配了处理器进程就可执行。就绪进程可以按多个优先级来划分队列。例如,当一个进程由于时间片用完而进入就绪状态时,排入低优先级队列;当进程由I/O操作完成而进入就绪状态时,排入高优先级队列。 结合上面的公式可以理解为, 就绪状态就是程序运行的资源已经准备好,等待CPU执行。 2)运行状态(Running): 进程占用处理器资源;处于此状态的进程的数目小于等于处理器的数目

多线程和多进程

旧时模样 提交于 2020-01-19 16:13:03
一、线程&进程 对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程,打开一个Word就启动了一个Word进程。进程是很多资源的集合。 有些进程还不止同时干一件事,比如Word,它可以同时进行打字、拼写检查、打印等事情。在一个进程内部,要同时干多件事,就需要同时运行多个“子任务”,我们把进程内的这些“子任务”称为线程(Thread)。 由于每个进程至少要干一件事,所以,一个进程至少有一个线程。当然,像Word这种复杂的进程可以有多个线程,多个线程可以同时执行,多线程的执行方式和多进程是一样的,也是由操作系统在多个线程之间快速切换,让每个线程都短暂地交替运行,看起来就像同时执行一样。当然,真正地同时执行多线程需要多核CPU才可能实现。线程是最小的执行单元,而进程由至少一个线程组成。 我们在做事情的时候,一个人做是比较慢的,如果多个人一起来做的话,就比较快了,程序也是一样的,我们想运行的速度快一点的话,就得使用多进程,或者多线程,在python里面,多线程被很多人诟病,为什么呢,因为Python的解释器使用了GIL的一个叫全局解释器锁,它不能利用多核CPU,只能运行在一个cpu上面,但是你在运行程序的时候,看起来好像还是在一起运行的

多任务,多进程

落花浮王杯 提交于 2020-01-18 05:29:41
多任务 多任务就是同一时刻多个任务同时执行,例如开演唱会时明星一边唱歌一边跳舞,开车时眼 睛看路手操作方向盘。这些都是多任务场景。对于电脑来说多任务就是同时运行多个应用程序,例如qq、微信、浏览器等等同时在电脑上 运行。 那多任务用代码怎么实现呢? 直接上代码 最好linux运行 #windowns 不支持 linux 支持 import os import time ret = os . fork ( ) if ret == 0 : while True : print ( "-----1-----" ) time . sleep ( 1 ) else : while True : print ( "-----2-----" ) time . sleep ( 1 ) #gitpid 得到自己的进程号 getppid 得到父类的进程号 父子进程先后顺序 import os import time t = os . fork ( ) if t == 0 : print ( "------子进程----" ) time . sleep ( 5 ) print ( "-----子进程over----" , end = "" ) else : print ( "-----父进程-----" ) #父进程不会因为子进程没进行完而等 什么是进程 我们想通过酷我听歌

Linux进程管理: 多进程编程

六眼飞鱼酱① 提交于 2020-01-17 02:13:11
多进程编程 mind-Mapping 保存有xmind原始文件,可直接获取 无名管道PIPE 命名管道FIFO POSIX共享内存 POSIX消息队列 POSIX信号量 SYS V共享内存 SYS V消息队列 SYS V信号量 来源: CSDN 作者: Z_Stand 链接: https://blog.csdn.net/Z_Stand/article/details/104011127

keras使用多进程

柔情痞子 提交于 2020-01-14 20:02:39
最近在工作中有一个需求:用训练好的模型将数据库中所有数据得出预测结果,并保存到另一张表上。数据库中的数据是一篇篇文章,我训练好的模型是对其中的四个段落分别分类,即我有四个模型,拿到文本后需要提取出这四个段落,并用对应模型分别预测这四个段落的类别,然后存入数据库中。我是用keras训练的模型,backend为tensorflow,因为数据量比较大,自然想到用多进程,但是使用时发现每次都在model.predict上停在那不动了。在Windows上运行一点问题没有,但是在Linux服务器上就有这个问题 模型使用时大致如下: # -*- coding: utf-8 -*- import jieba import numpy as np import keras import tensorflow as tf from keras.preprocessing import sequence from keras.models import load_model from config import Config import json config_file = 'data/config.ini' model_path = Config(config_file).get_value_str('cnn', 'model_path') graph = tf.Graph() with graph

深入理解NodeJS 多进程和集群

孤人 提交于 2020-01-13 21:07:44
进程和线程 “进程” 是计算机系统进行资源分配和调度的基本单位,我们可以理解为计算机每开启一个任务就会创建至少一个进程来处理,有时会创建多个,如 Chrome 浏览器的选项卡,其目的是为了防止一个进程挂掉而应用停止工作,而 “线程” 是程序执行流的最小单元,NodeJS 默认是单进程、单线程的,我们将这个进程称为主进程,也可以通过 child_process 模块创建子进程实现多进程,我们称这些子进程为 “工作进程”,并且归主进程管理,进程之间默认是不能通信的,且所有子进程执行任务都是异步的。 spawn 实现多进程 1、spawn 创建子进程 在 NodeJS 中执行一个 JS 文件,如果想在这个文件中再同时(异步)执行另一个 JS 文件,可以使用 child_process 模块中的 spawn 来实现,spawn 可以帮助我们创建一个子进程,用法如下。 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 // 文件:process.js const { spawn } = require( "child_process" ); const path = require( "path" ); // 创建子进程 let child = spawn( "node" , [ "sub_process.js" , "--port"

linux下关于IPC(进程间通信)

China☆狼群 提交于 2020-01-13 20:02:44
linux下进程间通信的主要几种方式 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信; 信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数); 报文(Message)队列(消息队列):消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。 共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。 信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。 套接口(Socket):更为一般的进程间通信机制

小白知识摘录__进程和线程

旧城冷巷雨未停 提交于 2020-01-13 12:51:21
转载一:  在理解进程和线程概念之前首选要对并发有一定的感性认识,如果服务器同一时间内只能服务于一个客户端,其他客户端都再那里傻等的话,可见其性能的低下估计会被客户骂出翔来,因此并发编程应运而生,并发是网络编程中必须考虑的问题。实现并发的方式有多种:比如多进程、多线程、IO多路复用。 多进程   进程是资源(CPU、内存等)分配的基本单位,它是程序执行时的一个实例。程序运行时系统就会创建一个进程,并为它分配资源,然后把该进程放入进程就绪队列,进程调度器选中它的时候就会为它分配CPU时间,程序开始真正运行。 多线程   线程是程序执行时的最小单位,它是进程的一个执行流,是CPU调度和分派的基本单位,一个进程可以由很多个线程组成,线程间共享进程的所有资源,每个线程有自己的堆栈和局部变量。线程由CPU独立调度执行,在多CPU环境下就允许多个线程同时运行。同样多线程也可以实现并发操作,每个请求分配一个线程来处理。 线程和进程各自有什么区别和优劣呢? 进程是资源分配的最小单位,线程是程序执行(CPU调度)的最小单位。 进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。而线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多。

【网络编程小结(三)】利用多进程与多线程

∥☆過路亽.° 提交于 2020-01-12 23:35:49
在第一节的例子中,服务器是一个时间获取程序,只要一次write调用就能立刻完成客户端的任务,但是我们要想的是,服务端不一定每次都会这么快的完成任务,所以,要想办法加快服务端的处理速度。 首先可以想到的是并行处理,c++有两种方式,一个是多进程,一个是多线程。下面描述这两种办法。 一、压力测试 我们的客户端应当有能力判断服务端处理的快慢,所以我们要写一个压力测试函数: void request_to_server(int id,const char* ip,const uint16_t port){ int sockfd=socket(AF_INET,SOCK_STREAM,0); const char *id_str=std::to_string(id).c_str(); sockaddr_in addr; bzero(&addr,sizeof(addr)); addr.sin_family=AF_INET; addr.sin_port=htons(port); inet_pton(AF_INET,ip,&addr.sin_addr); connect(sockfd,(const sockaddr*)&addr,sizeof(addr)); const int buffersize=1024; char buf[buffersize]; write(sockfd,id_str

python之多线程与多进程

戏子无情 提交于 2020-01-12 21:43:04
多线程类似于同时执行多个不同程序,多线程运行有如下优点: 使用线程可以把占据长时间的程序中的任务放到后台去处理。 用户界面可以更加吸引人,比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度。 程序的运行速度可能加快。 在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下我们可以释放一些珍贵的资源如内存占用等等。 每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。 每个线程都有他自己的一组CPU寄存器,称为线程的上下文,该上下文反映了线程上次运行该线程的CPU寄存器的状态。 指令指针和堆栈指针寄存器是线程上下文中两个最重要的寄存器,线程总是在进程得到上下文中运行的,这些地址都用于标志拥有线程的进程地址空间中的内存。 线程可以被抢占(中断)。 在其他线程正在运行时,线程可以暂时搁置(也称为睡眠) -- 这就是线程的退让。 线程可以分为: 内核线程: 由操作系统内核创建和撤销。 用户线程: 不需要内核支持而在用户程序中实现的线程。 Python3 线程中常用的两个模块为: _thread threading(推荐使用) thread 模块已被废弃。用户可以使用 threading 模块代替。所以,在 Python3 中不能再使用