多进程

C/C++网络编程7——多进程服务器端之fork函数

只愿长相守 提交于 2019-12-01 20:35:00
  通过前面几节的内容,我们已经可以实现基本的C/S结构的程序了,但是当多个客户端同时向服务器端请求服务时,服务器端只能按顺序一个一个的服务,这种情况下,客户端的用户是无法忍受的。所以虚实现并发的服务器端。 并发服务器端的实现方法:   1:多进程服务器端:通过创建多个进程提供服务。   2:多路复用服务器:用过捆绑并统一管理I/O对象提供服务。   3:多线程服务器:通过生成与客户端等量的线程提供服务。 多进程服务器端:   进程:可执行程序的一次执行过程。   在linux下可通过fork()函数创建一个进程。 #include <unistd.h> pid_t fork(void) // 成功返回时父进程返回子进程的id,子进程返回0,失败时返回-1   通过fork()函数创建进程以后,父进程和子进程拥有完全独立的内存空间。举例: #include <iostream> #include <unistd.h> using namespace std; int g_count = 10; int main() { int l_count = 20; g_count++; l_count++; pid_t pid = fork(); if (pid < 0) { cout << "fork() failed" << endl; return 0; } if (pid == 0)

Python中的进程

自闭症网瘾萝莉.ら 提交于 2019-12-01 20:10:11
Python中的进程 多进程 多进程是真正的并行 Python中的GIL,多线程不是CPU密集型程序的好的选择 多进程可以绕过GIL 多进程可以完全独立的进程环境中运行程序,可以充分利用多处理器 multiprocessing类 Process类 Process类遵循了Thread类的API.常用的进程线程方法大致相同 注意:在创建子进程的时候,windows会将当前父类代码重新加载执行一次,linux和mac会使用fork方法将父进程代码拷贝一份,再去执行 所以Windows下创建子进程要放入 __name__ == '__main__' 中执行 名称 说名 pid 查看进程id,等同于os.getpid() ppid 查看父进程的id(parent pid) exitcode 进程的退出状态码 terminate() 终止指定的进程 进程间同步 multiprocessing提供了共享内存,服务器进程来共享数据,还提供了Queue队列,Pipe管道用于进程间通信. 通讯方式不同: 1.多进程就是启动多个解释器进程,进程同新建必须序列化,反序列化,所以不能序列化的数据不能通信 2.数据的线程安全问题: ​ 由于每个进程中没有实现多线程,GIL就没什么用了 进程池 multiprocessing.Pool是进程池类 名称 说明 apply() 阻塞执行

Python3 多进程编程 - 学习笔记

牧云@^-^@ 提交于 2019-12-01 13:42:42
Python3 多进程编程(Multiprocess programming) 为什么使用多进程 具体用法 Python多线程的通信 进程对列Queue 生产者消费者问题 JoinableQueue Queue实例 管道Pipe Python3 多进程编程(Multiprocess programming) 为什么使用多进程   python中的多线程其实并不是真正的多线程,不能充分地使用多核CPU的资源,此时需要使用需要使用多进程解决问题。 具体用法   Python中的多进程是通过 multiprocessing 模块来实现的,和多线程的 threading.Thread 类似,利用 multiprocessing.Process 来创建一个进程对象。进程对象的方法和线程对象的方法类似,也有start(), join()等。 直接启用 代码实例 import multiprocessing from time import sleep def clock(interval): i = 0 while i<5: i += 1 print(f"Run >>> {i}") sleep(interval) print("Ending!") if __name__ == '__main__': p = multiprocessing.Process(target = clock,

Python多进程

时光总嘲笑我的痴心妄想 提交于 2019-12-01 11:55:58
multiprocessing 多进程multiprocessing模块和多线程threading模块的使用方式很类似,在CPU密集型的程序中多线程并不能达到高效运转的效果,为了发挥多核CPU的优势使用多进程更有效果 # -*- coding: utf-8 -*- import multiprocessing import requests from time import ctime import json def syc_email(userID, userName): """syc_email""" print("Start synchronizing %s %s" % ("email", ctime())) parameter = {"userId":userID,"userName":userName,"enterpriseId":"10330","flag":"sended"} request_own = requests.put("https://xxxxxx.leadscloud.com/mail/receiveSendedAndRubbishMail", data=parameter) data = request_own.json() print(json.dumps(data, indent=4, sort_keys=True, ensure_ascii

高并发Web服务的演变—节约系统内存和CPU

梦想的初衷 提交于 2019-12-01 11:12:24
#0 系列目录# 应用系统架构 大型网站技术架构的演进与设计 大型网站技术架构的实践 大型网站图片服务器架构的演进 大型网站架构的灵魂—性能 大型网站架构的缓存 亿级Web系统搭建—单机到分布式集群 高并发Web服务的演变—节约系统内存和CPU #1 越来越多的并发连接数# 现在的Web系统面对的并发连接数在近几年呈现指数增长,高并发成为了一种常态,给Web系统带来不小的挑战。以最简单粗暴的方式解决,就是增加Web系统的机器和升级硬件配置。虽然现在的硬件越来越便宜,但是一味地通过增加机器来解决并发量的增长,成本是非常高昂的。 结合技术优化方案,才是更有效的解决方法 。 并发连接数为什么呈指数增长?实际上,从这几年的用户基数上看,这个数量并没有出现指数增长,因此它并非主要原因。 主要原因,还是web变得更复杂,交互更丰富所导致的 。 ##1.1 页面元素增多,交互复杂## Web页面元素越来越多,更为丰富。更多的资源元素,意味着更多的下载请求。Web系统的交互越来越复杂,交互场景和次数也大幅增加。以“www.qq.com”的首页为例子,刷新一次,大概会有244个请求。并且,在页面打开完成之后,还会有一些定时的查询或者上报请求持续运作。 目前的Http请求, 为了减少反复的创建和销毁连接行为,通常都建立长连接(Connection keep-alive) 。一经建立

day25 多进程

帅比萌擦擦* 提交于 2019-12-01 10:21:11
目录 day25 多进程 今日内容 昨日回顾 今日内容详细 多任务 多进程 进程池 day25 多进程 今日内容 多任务 多进程 进程池 昨日回顾 魔法方法 __init__ __new__ __str__ __len__ __del__ __eq__ __hash__ 异常处理 try...except... try...except...except... try...except...else... finally 今日内容详细 多任务 我们打开任务管理器,就会发现,同一时刻用很多程序在运行。这种是的计算机可以同时处理多个任务的现象就是多任务处理。 有了多任务处理,我们才能做到在听歌的同时使用QQ聊天、办公和下载文件。 多任务处理的几个重要概念 串行:程序依照先后顺序,逐个执行,一次只能执行一个任务 并行:多个程序同时执行,需要CPU数目多于任务数才能实现 并发:在一段时间内,多个任务一起执行,因为时间很短,看起来就像同时执行一样,程序数可以多与CPU数 同步:一个程序执行完再调用另一个程序,要等程序执行完毕才能开始下一个程序 异步:一个程序执行中就调用另一个程序,不需要程序执行完就可以开启下一个程序,只有异步的情况才能实现并发 阻塞:CPU不工作 非阻塞:CPU工作 多进程 程序,是一个指令的集合,也就是我们写的一套代码。 进程则是指正在执行的程序。换句话说

4-2 阻塞IO

给你一囗甜甜゛ 提交于 2019-12-01 06:49:37
阻塞IO(blocking IO) 在linux中,默认情况下所有的socket都是blocking,一个典型的读操作流程大概是这样: 当用户进程调用了recvfrom这个系统调用,kernel就开始了IO的第一个阶段:准备数据。对于network io来说,很多时候数据在一开始还没有到达(比如,还没有收到一个完整的UDP包),这个时候kernel就要等待足够的数据到来。 而在用户进程这边,整个进程会被阻塞。当kernel一直等到数据准备好了,它就会将数据从kernel中拷贝到用户内存, 然后kernel返回结果,用户进程才解除block的状态,重新运行起来。 所以,blocking IO的特点就是在IO执行的两个阶段(等待数据和拷贝数据两个阶段)都被block了。 几乎所有的程序员第一次接触到的网络编程都是从listen\(\)、send\(\)、recv\(\) 等接口开始的, 使用这些接口可以很方便的构建服务器/客户机的模型。然而大部分的socket接口都是阻塞型的。如下图 ps: 所谓阻塞型接口是指系统调用(一般是IO接口)不返回调用结果并让当前线程一直阻塞 只有当该系统调用获得结果或者超时出错时才返回。 实际上,除非特别指定,几乎所有的IO接口 ( 包括socket接口 ) 都是阻塞型的。这给网络编程带来了一个很大的问题,如在调用recv(1024)的同时,线程将被阻塞

GearmanWorker的多进程实现

自作多情 提交于 2019-11-30 23:05:01
前言 因为项目原因选择了gearman作为任务委派的中间件,但原生的python拓展包只支持单进程,期间为了将gearman改造成自适应多进程的方式在实现方式上走进了些误区,故在此记录这些误区的坑以及目前的最优解决方案。 实现思路 实现方式 主进程接收任务,子进程处理任务。以一个主进程作为任务委派的接收进程,接收到任务后将任务分派给子进程进行处理,处理完成后由该子进程直接返回任务结果给gearman。 多进程接收并处理任务。批量fork多个子进程注册任务,子进程间互不影响,各自完成接收、处理任务的过程。 先说说第一种实现方式的优缺点 优点: 由于worker较多的时间是消耗在等待接收请求上,因此主进程只单一的进行轮训任务接收可以提高单条gearman请求通道的利用率。 由子进程直接返回任务结果可分离主进程与子进程的作业,主进程无需关心任务的结果而只专注于接收任务。 缺点: 主进程接收到任务请求后将请求转发给子进程处理任务,由于子进程处理任务完成后需要将任务结果返回给gearman,因此子进程需要将该任务请求对应的gearman socket传递给子进程,而该过程实现起来过于复杂。(通常具有socket的实例无法通过pickle传递给子进程,虽然Unix的sendmsg可以用来传递socket,但将传递的socket构造成一个GearmanWorker又是另外一件痛苦的事情)

Python之网络编程目录

爷,独闯天下 提交于 2019-11-30 18:05:59
Python之网络编程目录 源自路飞学城,网络编程部分师从Egon。 1、网络编程基础      1.1 网络编程之C/S架构      1.2 网络编程之TCP/IP各层详解      1.3 网络编程之Socket      1.4 网络编程之Socket代码实例      1.5 网络编程之粘包现象与解决方案 2、并发编程——多进程      2.1 网络编程之并发编程——操作系统介绍      2.2 网络编程之并发编程——进程理论      2.3 网络编程之并发编程——开启进程的两种方式      2.4 网络编程之并发编程——多进程中的join方法      2.5 网络编程之并发编程——守护进程      2.6 网络编程之并发编程——互斥锁      2.7 网络编程之并发编程——队列      2.8 网络编程之并发编程——生产者消费者模型 3、并发编程——多线程      3.1 网络编程之多线程——线程理论      3.2 网络编程之多线程——开启多线程的两种方式      3.3 网络编程之多线程——多线程与多进程的区别      3.4 网络编程之多线程——守护线程      3.5 网络编程之多线程——Thread对象的其他属性或方法      3.6 网络编程之多线程——GIL全局解释器锁      3.7 网络编程之多线程——死锁现象与递归锁  

线程,进程,多进程,多线程。并发,并行的区别与关系

半世苍凉 提交于 2019-11-30 16:42:02
一:线程与进程 1.概念 线程:是程序执行流的最小单元,是系统独立调度和分配 CPU(独立运行)的基本单位。 进程:是资源分配的基本单位。一个进程包括多个线程。 进程 ≥ 线程 2.区别: 1.线程与资源分配无关,它属于某一个进程,并与进程内的其他线程一起共享进程的资源。 2.每个进程都有自己一套独立的资源(数据),供其内的所有线程共享。 3.不论是大小,开销线程要更“轻量级” 4.一个进程内的线程通信比进程之间的通信更快速,有效。(因为共享变量) 二 .多线程与多进程 多线程:同一时刻执行多个线程。用浏览器一边下载,一边听歌,一边看视频,一边看网页。。。 多进程:同时执行多个程序。如,同事运行 YY,QQ,以及各种浏览器。 三 .并发与并行 并发当有多个线程在操作时 ,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间 段分配给各个线程执行,在一个时间段的线程代码运行时,其它线程处于挂起状。.这种方式我们称之为并发(Concurrent)。 并行:当系统有一个以上 CPU时,则线程的操作有可能非并发。当一个CPU执行一个线程时,另一个CPU可以执行另一个线程,两个线程互不抢占CPU资源,可以同时进行,这种方式我们称之为并行(Parallel)。 以下为详细的概念的讲解 并发: 并发,在 操作系统 中