【问题标题】:Kill a worker thread after a certain time in python2.7在python2.7中一段时间​​后杀死一个工作线程
【发布时间】:2018-08-29 10:01:29
【问题描述】:

我正在使用线程处理 Python 2.7 脚本。

有一个全局连接对象,每个线程都必须使用它。

代码示例:

from threading import Thread
import time


class Connection:
    def __init__(self):
        self.connected = True

    def send_command(self, command):
        return str(command)+' result'


class Config:
    def __init__(self):
        self.conn = Connection()

    def do_remote_config(self):
        time.sleep(2)
        return self.conn.send_command('my config')
        
    def do_other_remote_config(self):
        time.sleep(2)
        return self.conn.send_command('my other config')


class Executor:
    def execute(self):
        config = Config()
        
        worker1 = Worker(config.do_remote_config)
        worker1.start()
        worker1.join()
        print(worker1.result)
        
        worker2 = Worker(config.do_other_remote_config)
        worker2.start()
        worker2.join()
        print(worker2.result)


class Worker(Thread):
    def __init__(self, method):
        super(Worker, self).__init__()
        self.result = None
        self.method = method

    def run(self):
        try:
            self.result = self.method()
        except Exception as ex:
            self.result = ex


if __name__ == "__main__":
    e = Executor()
    e.execute()

为了确保没有一个线程运行超过 10 分钟,我想杀死每个线程以防达到时间限制。不幸的是,事实证明 Python 线程无法被杀死。

Thread Kill Pill 选项:

由于工作线程的实际复杂性,遗憾的是无法构建某种杀死触发器,让工作线程自行结束。所以,看来我真的需要在这里摆脱线程,因为线程本质上是不能被杀死的。

多进程选项:

使用多进程模块,可以使用不同的进程。然后可以在一定时间后将其杀死。但是,我没有找到一种方法来传递我的连接对象,以便它可以被多个进程使用。

远程过程调用 (RPC) 选项:

RPC 似乎引入了不必要的复杂性,并且可能仍然无法实现终止开关。

问题:

为了能够与所有工作人员一起使用连接对象,同时确保每个工作人员可以在 10 分钟后可靠地被杀死,哪种 Python 技术效果最好?

非常感谢!

【问题讨论】:

    标签: python multithreading python-2.7


    【解决方案1】:

    评论太长,答案太抽象。

    如果您希望能够在不修改整个处理的情况下随机中断处理,我会说多处理是可行的方法。所有其他方法都需要与被中断的线程进行某种合作。

    当然,将整个流程拆分为多个部分也需要进行一些处理更改。所有共享类文件资源(打开的文件、套接字、管道)都将在进程分叉之前打开并精心编排。可能最安全的方法是这样的:

    您有一个由主进程listen()ed 的主套接字。主人还运行一个工人池。必须在池之前创建主套接字,以使套接字可供工作人员使用。

    主人将新的工作任务交付给工人,并在需要时通过multiprocessing primitives接收结果。

    当一个新客户端到达时,master 从池中命令一个选定的 worker 到accept() 连接并返回到等待新客户端和其他 master 的活动。工作人员accept()s 连接,因此创建了一个私有套接字来与特定客户端通信,其他工作人员不能而且应该访问客户端套接字。

    如果工作人员需要相互通信,则必须在池之前创建所有必要的通信原语,并由主服务器分配给工作人员。

    【讨论】:

    • 感谢您的解释。不幸的是,它似乎没有回答我关于如何重用共享资源并同时能够从主人那里杀死工人的主要问题。我很想使用多处理模块,但似乎使用那个模块根本不可能直接将我的连接对象传递给工作人员。
    猜你喜欢
    • 2017-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-29
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    相关资源
    最近更新 更多