我正在使用线程编写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线程无法被杀死。
线程杀戮选项:
由于工作线程的实际复杂性,遗憾的是不可能构建某种kill-trigger,这会让工作线程自己结束。所以,似乎我真的需要摆脱这里的线程,因为天生的线程不能被杀死。
多进程选项:
使用多进程模块,可以使用不同的进程。那些可能会在一段时间后被杀死。但是我没有找到一种方法来传递我的连接对象,以便它可以被多个进程使用。
远程过程调用(RPC)选项:
RPC似乎引入了不必要的复杂程度,并且可能仍然没有实现kill switch。
问题:
哪些Python技术最适合使用连接对象与所有工作人员,同时确保每个工作人员在10分钟后可以被可靠地杀死?
非常感谢!
答案 0 :(得分:0)
评论太长了,答案太抽象了。
我想说如果您希望能够在不改变整个处理的情况下在随机时刻中断处理,那么多处理是可行的方法。所有其他方法都要求线程被中断的某种合作。
当然,将整个过程分成几部分也需要一些处理变更。所有共享类似文件的资源(打开的文件,套接字,管道)将在分支流程之前打开并仔细编排。可能最安全的方法是这样的:
您有一个由主进程listen()
创建的主套接字。主人还经营一个工人池。在池之前创建主套接字是必不可少的,以便为工作者提供套接字。
主人向工作人员提供新的工作任务,并在需要时通过multiprocessing primitives接收结果。
当新客户端到达时,主服务器将选定的工作人员从池中命令到accept()
连接并返回以等待新客户端和其他主服务器的活动。工作者accept()
建立连接,从而创建一个私有套接字以与特定客户端进行通信,其他工作人员无法且应该访问客户端套接字。
如果工人需要相互沟通,则必须在池之前创建所有必要的通信原语,并由主人在工人之间分配。