当前位置:   article > 正文

python守护进程 任务_[Python网络编程]浅析守护进程后台任务的设计与实现

subprocess. popen shell true变成守护进程

TASK = {} # task_id: pid

class ScanModule(Module):

MODULE_NAME = "SCAN_MODULE"

def do_start(self):

self.send_success('start ok')

DEBUG('------------task start------------')

task_ids = [int(task_id) for task_id in self.task_ids.split(',') if int(task_id) not in TASK]

for task_id in task_ids:

try:

cmd = 'python scan.py -t %s' % task_id

DEBUG(cmd)

self.sub = Popen(cmd, shell=True, cwd=CWD)

pid = int(self.sub.pid)

TASK[task_id] = pid

INFO('%s start a new task,task_id:%s,pid:%s' %(self.MODULE_NAME, task_id, pid))

except Exception:

ERROR('%s start a new task,task_id:%s failed' % (self.MODULE_NAME, task_id))

def do_stop(self):

self.send_success('stop ok')

DEBUG('------------task stop------------')

task_ids = [int(task_id) for task_id in self.task_ids.split(',') if int(task_id) in TASK]

for task_id in task_ids:

pid = TASK.pop(task_id)

try:

INFO('%s stop a new task,task_id:%s,pid:%s' %(self.MODULE_NAME, task_id, pid))

call(['taskkill', '/F', '/T', '/PID', str(pid)])

except Exception:

ERROR('%s taskkill a task failed,task_id:%s,pid:%s' %(self.MODULE_NAME, task_id, pid))

module_register(ScanModule.MODULE_NAME, ScanModule)

上面实现了一个简单的扫描模块。支持两个action,start,stop。

start非常easy。调用gevent的subprocess.Popen执行子进程,并记录pid,stop则使用taskkill直接杀掉该进程。

这里有两点须要注意:

1.不要用原生的subprocess模块。因为原生的subprocess是堵塞的,这可能导致主处理逻辑也堵塞,不能服务很多其它的请求

最后别忘了调用module_register注冊相应模块。

2.方法一開始最好就返回结果。因为前台非常可能在等待返回。

所以说as soon as possible

以下提供一个客户端用于測试。client.py

#!/usr/bin/env python

#-*-encoding:UTF-8-*-

import hmac

import gevent

from gevent import monkey

monkey.patch_socket()

addr = ('localhost', 6667)

def send_request(module_name,request_headers):

SECRE_KEY = "YI-LUO-KEHAN"

socket = gevent.socket.socket()

socket.connect(addr)

request_headers['module'] = module_name

request_headers['signature'] = hmac.new(SECRE_KEY, module_name).hexdigest()

h = ["%s:%s" %(k, v) for k,v in request_headers.iteritems()]

h.append('\n')

request = '\n'.join(h)

socket.send(request)

print socket.recv(8192)

socket.close()

if __name__ =="__main__":

import sys

if sys.argv[1] == 'start':

send_request('SCAN_MODULE',{'action':'start','task_ids':'1'})

else:

send_request('SCAN_MODULE',{'action':'stop','task_ids':'1'})

我们来简单的測试一下:

注意:因为要注冊到服务,cmd须要管理员权限

至于start中调用的scan.py随便写一个就能够

截图例如以下,我们看到成功!

感兴趣的童鞋能够參考,请大家多提意见。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/236263
推荐阅读
相关标签
  

闽ICP备14008679号