第5章 作业和进程池(2)

5.6 作业对象事件和完成端口

(1)将作业对象与完成端口对象关联起来

JOBOBJECT_ASSOCIATE_COMPLETION_PORT joacp;

joacp.CompletionKey = hJob1; //可用来标识作业对象任意唯一值,这里取其句柄

joacp.CompletionPort = hIOCP; //完成端口的句柄

SetInformationJobObject(hJob,JobObjectAssociateCompletionPortInformation,

&joacp,sizeof(joacp));

(2)创建线程,将完成端口对象作为参数传入线程函数。并GetQueuedCompletionStatus来等待作业对象的通知事件。


参数


描述


hIOCP


要获取事件的完成端口对象的句柄


pNumBytesTransferred


等待的事件ID

【与作业对象有关的事件】

①JOB_OBJECT_MSG_ACTIVE_PROCESS_LIMIT:作业对象中活动进程数达到上限时通知

②JOB_OBJECT_MSG_ACTIVE_PROCESS_ZERO:作业对象中当前没有活动进程时通知

③JOB_OBJECT_MSG_END_OF_JOB_TIME:作业对象耗尽指定的时间片时通知。但其中的进程不会自动终止。可以设置一个新的时间限额以允许继续,或调用TerminateJobObject来终止进程。

④JOB_OBJECT_MSG_JOB_MEMORY_LIMIT:作业对象耗尽指定的内存时通知,同时给出进程ID

【与进程有关的事件】

①JOB_OBJECT_MSG_NEW_PROCESS:新进程加入作业对象时通知,并给出进程ID。

②JOB_OBJECT_MSG_EXIT_PROCESS:进程正常退出时通知,并给出进程ID。

③JOB_OBJECT_MSG_ABNORMAL_EXIT_PROCESS:进程异常退出时通知,并给出进程ID

④JOB_OBJECT_MSG_END_OF_PROCESS_TIME:进程耗尽时间片时通知,进程将终止,并给出进程ID

⑤JOB_OBJECT_MSG_PROCESS_MEMORY_LIMIT:进程消耗内存数量达到上限时通知,同时给出进程ID。


pCompletionKey


指定触发这个事件的作业对象的句柄(可以将一个完成端口对象与多个作业对象进行绑定)


pOverlapped


在作业事件中,该值表示哪个进程ID发生的事件。


dwMilliseconds


用于指定调用者等待完成端口的时间

注意:

①作业对象的状态变为己触发是在分配作业的时间到期时,而不是所有进程都结束时。

②默认下,当作业时间到期时,它的所有进程都会自动终止,所以也就不会投递JOB_OBJECT_MSG_END_OF_JOB_TIME。如果只想发送该通知给应用程序,而让应用程序自行来杀死进程,可以做如下设置:

//创建结构体,并将JOb结束时要采取的措施填入该结构体

JOBOBJECT_END_OF_JOB_TIME_INFORMATION joeojti;

  joeojti.EndOfJobTimeAction = JOB_OBJECT_POST_AT_END_OF_JOB; //投递通知,而不是“杀死”进程。创建作业时,默认值为JOB_OBJECT_TERMINATE_AT_END_OF_JOB;

//告诉作业对象当作业时间到期时,要采取的措施

SetInformationJobObject(hJob,JobObjectEndOfJobTimeInformation,

&joeojti,sizeof(joeojti));

【JobIO】利用完成端口实现进程管理

时间: 2024-10-12 19:44:21

第5章 作业和进程池(2)的相关文章

第5章 作业和进程池(1)

5.1 作业对象 (1)什么是作业对象 ①进程的父子关系只存在于创建的子进程的那一刻,Windows并不一直维护着这种父子关系,这使得管理进程并不是件容易的事. ②作业对象是用于将一组进程作为一个管理单元的内核对象,本质上可以理解为其实就是进程池对象,可将作业对象看作是进程的容器. ③作来对象可以用来限制一组进程的占用内存数量.占用CPU周期数.进程优先级等的一个“沙箱”. ④最终可以通过作业对象将该对象中的所有进程全部关闭(普通方法很难控制) ⑤通过结合一个完成端口对象并利用一个线程实时动态的

第十五章、线程池和进程池

目录 第十五章.线程池和进程池 一.线程计时器 二.异步同步 三.线程池和进程池 第十五章.线程池和进程池 一.线程计时器 from threading import Timer,current_thread def task(x): print('%s run....' %x) print(current_thread().name) if __name__ == '__main__': t=Timer(3,task,args=(10,)) # 3s后执行该线程 t.start() print

Gradle 1.12翻译——第十九章. Gradle 守护进程

有关其他已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或访问:http://gradledoc.qiniudn.com/1.12/userguide/userguide.html 本文原创,转载请注明出处:http://blog.csdn.net/maosidiaoxian/article/details/41343615 关于我对Gradle的翻译,以Github上的项目及http://gradledoc.qin

Python--线程队列(queue)、multiprocessing模块(进程对列Queue、管道(pipe)、进程池)、协程

队列(queue) 队列只在多线程里有意义,是一种线程安全的数据结构. get与put方法 ''' 创建一个"队列"对象 import queue q = queue.Queue(maxsize = 10) queue.Queue类即是一个队列的同步实现.队列长度可为无限或者有限.可通过Queue的构造函数的可选参数maxsize来设定队列长度.如果maxsize小于1就表示队列长度无限. 将一个值放入队列中: q.put() 调用队列对象的put()方法在队尾插入一个项目.put()

Python 多进程和进程池

一,前言 进程:是程序,资源集合,进程控制块组成,是最小的资源单位 特点:就对Python而言,可以实现真正的并行效果 缺点:进程切换很容易消耗cpu资源,进程之间的通信相对线程来说比较麻烦 线程:是进程中最小的执行单位. 特点无法利用多核,无法实现真正意义上是并行效果. 优点:对于IO密集型的操作可以很好利用IO阻塞的时间 二,多进程 2.1 multiprocessing模块介绍 在上一节多线程中讲到,由于GIL的原因,多线程无法利用多核优势,如果想要充分地使用多核CPU的资源,在pytho

内存池、进程池、线程池

首先介绍一个概念"池化技术 ".池化技术 一言以蔽之就是:提前保存大量的资源,以备不时之需以及重复使用. 池化技术应用广泛,如内存池,线程池,连接池等等.内存池相关的内容,建议看看Apache.Nginx等开源web服务器的内存池实现. 起因:由于在实际应用当中,分配内存.创建进程.线程都会设计到一些系统调用,系统调用需要导致程序从用户态切换到内核态,是非常耗时的操作.           因此,当程序中需要频繁的进行内存申请释放,进程.线程创建销毁等操作时,通常会使用内存池.进程池.

Python 3 进程池与回调函数

Python 3 进程池与回调函数 一.进程池 在利用Python进行系统管理的时候,特别是同时操作多个文件目录,或者远程控制多台主机,并行操作可以节约大量的时间.多进程是实现并发的手段之一,需要注意的问题是: 很明显需要并发执行的任务通常要远大于核数 一个操作系统不可能无限开启进程,通常有几个核就开几个进程 进程开启过多,效率反而会下降(开启进程是需要占用系统资源的,而且开启多余核数目的进程也无法做到并行) 例如当被操作对象数目不大时,可以直接利用multiprocessing中的Proces

Windows2008操作系统 IIS7 IIS7.5 进程池经常死最终解决方案

作为一个服务器维护人员,经常遇到不可解决的问题,这问题一直存在,一直困扰我多时,经常凌晨1-2点起床,就为了重启一下进程池 错误应用程序名称: w3wp.exe,版本: 7.5.7600.16385,时间戳: 0x4a5bd0eb错误模块名称: ntdll.dll,版本: 6.1.7600.16385,时间戳: 0x4a5be02b异常代码: 0xc0000374错误偏移量: 0x00000000000c6cd2错误进程 ID: 0xb54c错误应用程序启动时间: 0x01d0c0d94f915

python进程池剖析(一)

python中两个常用来处理进程的模块分别是subprocess和multiprocessing,其中subprocess通常用于执行外部程序,比如一些第三方应用程序,而不是Python程序.如果需要实现调用外部程序的功能,python的psutil模块是更好的选择,它不仅支持subprocess提供的功能,而且还能对当前主机或者启动的外部程序进行监控,比如获取网络.cpu.内存等信息使用情况,在做一些自动化运维工作时支持的更加全面.multiprocessing是python的多进程模块,主要