任务对象。每个任务都会创建一个Task类实例
| 32 | |
| 33 | |
| 34 | class Task(object): |
| 35 | """任务对象。每个任务都会创建一个Task类实例""" |
| 36 | def __init__(self, task_id, task_name, request_file, response_file, log_file, env): |
| 37 | """ |
| 38 | :param task_id(int): 任务id |
| 39 | :param task_name(str): 任务名,对应task包下的py名 |
| 40 | :param request_file: 任务request文件路径 |
| 41 | :param response_file: 任务response文件路径 |
| 42 | :param log_file: 任务日志文件路径 |
| 43 | :param env: 任务执行的环境变量 |
| 44 | """ |
| 45 | self.task_id = task_id |
| 46 | self.task_name = task_name |
| 47 | self.task_log = log_file |
| 48 | self.request_file = request_file |
| 49 | self.response_file = response_file |
| 50 | self.env = env |
| 51 | |
| 52 | self._done = False |
| 53 | |
| 54 | self.code = None |
| 55 | self.msg = None |
| 56 | self.data = None |
| 57 | self._task_proc = None |
| 58 | self._task_expired_time = None |
| 59 | |
| 60 | def _read_tail_lines(self, filepath): |
| 61 | """读取文件末尾的1024字节 |
| 62 | """ |
| 63 | try: |
| 64 | with open(filepath, 'r') as fh: |
| 65 | fh.seek(0, os.SEEK_END) |
| 66 | size = fh.tell() |
| 67 | pos = 1024 |
| 68 | if size>pos: |
| 69 | fh.seek(size-pos, os.SEEK_SET) |
| 70 | lines = fh.readlines() |
| 71 | return lines[1:] |
| 72 | else: |
| 73 | fh.seek(0, os.SEEK_SET) |
| 74 | return fh.readlines() |
| 75 | except Exception as err: |
| 76 | message = "read file(%s) tail lines error: %s" % (filepath, str(err)) |
| 77 | logger.error(message) |
| 78 | return message |
| 79 | |
| 80 | def terminate(self): |
| 81 | """kill the task""" |
| 82 | if settings.PLATFORMS[sys.platform] == "windows": |
| 83 | # 在windows平台上只调用terminate,只能关闭子进程,无法关闭孙子进程,需要通过递归遍历子进程来关闭 |
| 84 | # 先关闭子进程,原因:子进程如果一直在启动孙进程,先关闭孙进程再关闭子进程,两步之间可能会有孙进程漏关 |
| 85 | try: |
| 86 | task_proc = psutil.Process(self._task_proc.pid) |
| 87 | children = task_proc.children(recursive=True) |
| 88 | self._task_proc.terminate() # 关闭子进程 |
| 89 | logger.info("kill children processes: %s" % children) |
| 90 | for child in children: |
| 91 | try: |
no outgoing calls