『壹』 并发编程 下
进程是计算机中资源分配的最小单元;一个进程中可以有多个线程,同一个进程中的线程共享资源;
进程与进程之间则是相互隔离。
Python中通过多进程可以利用CPU的多核优势,计算密集型操作适用于多进程。
关于在Python中基于multiprocessiong模块操作的进程:
fork ,【“拷贝”几乎所有资源】【支持文件对象/线程锁等传参】【unix】【任意位置开始】【快】
spawn ,【run参数传必备资源】【不支持文件对象/线程锁等传参】【unix、win】【main代码块开始】【慢】
forkserver ,【run参数传必备资源】【不支持文件对象/线程锁等传参】【部分unix】【main代码块开始】
官方文档:https://docs.python.org/3/library/multiprocessing.html
示例1
示例2
案例:
进程的常见方法:
进程是资源分配的最小单元,每个进程中都维护自己独立的数据,不共享。
如果想要让他们之间进行共享,则可以借助一些特殊的东西来实现。
Shared memory
Data can be stored in a shared memory map using Value or Array . For example, the following code【 数据可以使用Value或Array存储在共享内存映射中。 例如下面的代码 】
Server process
A manager object returned by Manager() controls a server process which holds Python objects and allows other processes to manipulate them using proxies.
【 manager()返回的管理器对象控制一个服务器进程,该进程保存Python对象,并允许其他进程使用代理操作这些对象。 】
multiprocessing supports two types of communication channel between processes
【 支持两种进程之间的通信通道 】
Queues
The Queue class is a near clone of queue.Queue . For example
Pipes
The Pipe() function returns a pair of connection objects connected by a pipe which by default is plex (two-way). For example:
函数返回一对由管道连接的连接对象,该管道默认为双工(双向)。 例如:
上述都是Python内部提供的进程之间数据共享和交换的机制,作为了解即可,在项目开发中很少使用,后期项目中一般会借助第三方的来做资源的共享,例如:MySQL、redis等。
如果多个进程抢占式去做某些操作时候,为了防止操作出问题,可以通过进程锁来避免。
很显然,多进程在操作时就会出问题,此时就需要锁来介入:
注意:如果在进程池中要使用进程锁,则需要基于Manager中的Lock和RLock来实现。
暂时以了解为主。
计算机中提供了:线程、进程 用于实现并发编程(真实存在)。
协程(Coroutine),是程序员通过代码搞出来的一个东西(非真实存在)。
协程也可以被称为微线程,是一种用户态内的上下文切换技术。
简而言之,其实就是通过一个线程实现代码块相互切换执行(来回跳着执行)。
例如:
上述代码是普通的函数定义和执行,按流程分别执行两个函数中的代码,并先后会输出: 1、2、3、4 。
但如果介入协程技术那么就可以实现函数见代码切换执行,最终输入: 1、3、2、4 。
在Python中有多种方式可以实现协程,例如:
虽然上述两种都实现了协程,但这种编写代码的方式没啥意义。
这种来回切换执行,可能反倒让程序的执行速度更慢了(相比较于串行)。
协程如何才能更有意义呢?
通过上述内容发现,在处理IO请求时,协程通过一个线程就可以实现并发的操作。
现在很多Python中的框架都在支持协程,比如:FastAPI、Tornado、Sanic、Django 3、aiohttp等,企业开发使用的也越来越多(目前不是特别多)。
『贰』 epoll编程,如何实现高并发服务器开发
首先,我们需要了解epoll编程的概念。epoll是一项对Linux内核进行的轮询,以处理大量的文件描述符和一个增强版的Linux下多路复用IO接口选择/投票。
一个成熟的高性能服务器,epoll相关代码,不到1万分之一。在今天的posix和Unix /BSD/ systemv设计的回顾中,epoll补丁不应该被实现。异步反应器框架应该只有一个简单的、统一的选择器。
5、是不是可以使用epoll技术跟多线程技术配合开发?如何?
6、系统应该怎样开发使用TCP协议。
『叁』 java程序员面试时被问到:如何在j2ee项目中处理高并发量访问 该怎么回答 请仔细看题干再回答
你好,高并发系统的设计需要注意一下几点:
尽量使用缓存,包括用户缓存,信专息缓存等,多花点内存来做缓存,属可以大量减少与数据库的交互,提高性能。
用jprofiler等工具找出性能瓶颈,减少额外的开销。
优化数据库查询语句,减少直接使用hibernate等工具的直接生成语句(仅耗时较长的查询做优化)。
优化数据库结构,多做索引,提高查询效率。
统计的功能尽量做缓存,或按每天一统计或定时统计相关报表,避免需要时进行统计的功能。
能使用静态页面的地方尽量使用,减少容器的解析(尽量将动态内容生成静态html来显示)。
解决以上问题后,使用服务器集群来解决单台的瓶颈问题。
基本上以上述问题解决后,达到系统最优。
至于楼上有人提到别用JAVA来做,除非是低层的连接数过大(如大量的端口占用需求),这种情况下考虑直接C来写,其他的可以用JAVA来做。