2 skaitiaozhan skaitiaozhan 于 2016.02.25 10:58 提问

进程池实现的多进程服务器问题

main函数中先实现进程池。主进程创建pipe管道,fork出一个子进程,作为控制进程,在控制进程中fork多个子进程作为业务处理进程,全部阻塞。
接着主进程开始socket一系列操作,在accept阻塞。
while(1){
connect_socket = accepet();
...
kill(control_pid,SIGUSR1);
}
现在我把connect_socket描述符通过pipe管道传给控制进程,通过控制进程去调度业务进程处理业务。
那么问题来了,我用signal SIGSUR1去通知控制进程任务到来。现在多个客户端几乎同时连接服务端,该如何实现控制进程接受任务取得pipe中的连接套接字而不重入导致部分任务被忽略?

我之前的做法是定义一个全局原子变量count,信号处理函数中++count,在控制进程中通过判断count与上次循环的值做比较判断任务是否到来。但是信号处理函数返回后如果立刻又接受到信号会导致任务忽略。
求大牛们帮忙给个更好的处理方案,原则是pipe管道的通信方式不变,因为通过共享内存实现的话我不需要控制进程调度业务进程了,主进程完全可以实现调度,现在需要解决的就是如何实现给控制进程发送信号无论什么情况下他都不会遗漏接收连接套字并且传输给业务进程通知处理。谢谢

不知道在算法层面能否解决这个问题,如果能解决的话更好了

5个回答

devmiao
devmiao   Ds   Rxr 2016.02.25 22:16
已采纳
skaitiaozhan
skaitiaozhan 做这个server陆陆续续出现了很多问题,这种传递fd的方式不可取,这位答主在我的另一问中给予了解答,非常感谢
2 年多之前 回复
skaitiaozhan
skaitiaozhan   2016.02.25 11:15

不知道在算法层面能否解决这个问题,如果能解决的话更好

mengyin521
mengyin521   2016.02.25 11:45

这块跟你是不是多进程没有关系,主要是消息队列。你可以主要看一下 消息队列。
消息都获取到了 直接一个一个提取 该扔给哪个进程 或线程 都属于业务处理范畴了。

skaitiaozhan
skaitiaozhan 因为获取服务的频率是随机的,安排给控制进程的工作是来一个任务分发一个任务,但是任务分发中可能会遗漏。我想了想还是直接让控制进程跑while(1)好了,谢谢了
2 年多之前 回复
devmiao
devmiao   Ds   Rxr 2016.02.25 22:15
oyljerry
oyljerry   Ds   Rxr 2016.02.25 22:14

任务放一个队列 进程间只是通信让其它进程去队列取任务执行

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
多进程、进程池
多进程Manager 数据共享的方式只有两种结构Value和Array。Python中提供了强大的Manage专门用来做数据共享的,其支持的类型非常多,包括,Value, Array,list,dict, Queue, Lock等。 from multiprocessing import Process, Manager def func(dt, lt): for i in range
Python 多进程 进程池
Python 多进程 进程池 在前文Python 多进程编程介绍了Python的多进程库multiprocessing中的进程池类Pool,但是后来使用的时候还是发现一些不好用的地方。这里我自己做了一个自定义的进程池 MultiProcessPool类来方便处理。 系统的进程池类 Pool 如下代码,所有的子进程返回结果都是保存在一个名为tasks的list中。 处理子进程返回结果的时...
多线程、多进程、线程池、进程池
多任务不管是单核CPU还是多核CPU,一旦任务数量超过核数,OS都会把每个任务轮流调度到每个核心上。OS实现多进程和多线程往往是通过时间片的形式执行的,即让每个任务(进程/线程)轮流交替执行,因为时间片切分的很小,以至于我们感觉多个任务在同时执行。如果我们要同时执行多个任务怎么办?主要有两种解决方案: 一种是启动多个进程,每个进程虽然只有一个线程,但多个进程可以一块执行多个任务。 还有一种方法是启动
多进程的Pool进程池理解Python3
 # -*- coding:utf-8 -*-  from multiprocessing import Pool import os, time, randomdef long_time_task(name):     #执行函数         print('run task %s (%s)...'% (name,os.getpid()))             start = time.t...
Python多进程操作-进程池(Pool)
在使用Python进行系统管理时,特别是同时操作多个文件目录或者远程控制多 台主机,并行操作可以节约大量的时间。如果操作的对象数目不大时,还可以直 接使用Process类动态的生成多个进程,十几个还好,但是如果上百个甚至更多, 那手动去限制进程数量就显得特别的繁琐,此时进程池就派上用场了。 Pool类可以提供指定数量的进程供用户调用,当有新的请求提交到Pool中时, 如果池还没有满,就会
python多进程中的进程池pool
由于 python的多线程不能使用多核cpu,只能使用多进程。 在工作中遇到了需要处理几百万的数据条,查阅了相关资料发现使用多进程的进程池功能能够很好的解决问题。 进程池有两个调用执行代码的接口,分别是map和apply_async。map所限于不能调用执行代码有过个参数的情况,因此主要使用apply_async。 在使用过程中不能将执行代码写在类里面。 def log_result(re
多进程multiprocessing-进程池Pool
进程池Pool的两种添加任务的方式:异步和同步 异步添加:就是随机的让进程池中空闲的进程去执行任务函数,注意所有任务是一次性添加进入进程池, 只是进程池中的进程随机分配完成所有的任务。 #Pool.apply_async(要调用的目标,(传递给目标的参数元祖,)) #每次循环将会用空闲出来的子进程随机去调用目标 #pool.close() #pool.join()
Python多进程之进程池
由于Python中线程封锁机制,导致Python中的多线程并不是正真意义上的多线程。当我们有并行处理需求的时候,可以采用多进程迂回地解决。如果要在主进程中启动大量的子进程,可以用进程池的方式批量创建子进程。 首先,创建一个进程池子,然后使用apply_async()方法将子进程加入到进程池中。import multiprocessing import os import time from dat
php-fpm使用多进程池
参考:http://mail.cfanz.cn/index.php?c=article&a=read&id=284348 环境:cento6 nginx phpfpm 默认php-fpm只启动一个池,在/etc/php-fpm.d/www.conf /etc/php-fpm.conf里,会加载/etc/php-fpm.d/下*.conf文件,所以直接复制出来一份www.conf修改后即可。别
【Python】多进程的进程池pool运行时报错:ValueError: Pool not running
我刚接触python爬虫,所以有些地方不是很懂。我最近写了一个python爬虫,作用是从一个动漫网站上爬图片。由于一张一张下载太慢,我用了并发的方法Pool。p = Pool(10) for key in dd.keys(): createDirs(key)//创建目录 urls = img_url(dd[key])//返回图片地址 for index,url in enu