Pexpect 多线程空闲状态

Posted

技术标签:

【中文标题】Pexpect 多线程空闲状态【英文标题】:Pexpect Multi-Threading Idle State 【发布时间】:2022-01-10 01:31:29 【问题描述】:

我们有大约 15,000 个节点可以通过 Pexpect 登录并从中提取数据。为了加快速度,我正在做多处理——在 12 个内核之间平均分配负载。效果很好,但这仍然是每个核心超过 1000 个节点 - 一次处理一个。

每个内核在执行此处理时的 CPU 利用率约为 2%。这是有道理的,因为大部分时间只是在等待看到 Pexpect 期望值作为节点流输出。为了尝试利用这一点并进一步加快速度,我想在每个内核的多处理中实现多线程。

为了避免共享变量的任何问题,我将登录到字典中的节点所需的所有数据(每个节点在字典中的一个键),然后对字典进行切片,每个线程接收一个唯一的切片。然后在线程完成后,我将字典切片重新组合在一起。

但是,我仍然看到一个线程完全完成,然后再转到下一个线程。

我想知道什么构成了空闲状态,这样一个核心可以移动到另一个线程上工作?它总是在寻找 Pexpect 期望值这一事实是否意味着它永远不会空闲?

另外,因为我对每个线程使用相同的目标函数。我不确定每个线程的目标函数是否相同(该函数的本地变量相同)是否会影响这一点?

我的多线程代码如下,供参考。

感谢您的任何见解!

import threading
import <lots of other stuff>

class ThreadClass(threading.Thread):
    def __init__(self, outputs_dict_split):
        super(ThreadClass, self).__init__()
        self.outputs_dict_split = outputs_dict_split
    def run(self):
        outputs_dict_split = get_output(self.outputs_dict_split)
        return outputs_dict_split

def get_output(outputs_dict):
    ### PEXPECT STUFF TO LOGIN AND RUN COMMANDS ####
    ### WRITE DEVICE'S OUTPUTS TO DEVICE'S OUTPUTS_DICT RESULTS SUB-KEY ###

def backbone(outputs_dict):
    filterbykey = lambda keys: x: outputs_dict[x] for x in keys
    num_threads = 2
    device_split = np.array_split(list(outputs_dict.keys()), num_threads)

    outputs_dict_split_list = []
    split_list1 = list(device_split[0])
    split_list2 = list(device_split[1])
    outputs_dict_split1 = filterbykey(split_list1)
    outputs_dict_split2 = filterbykey(split_list2)
    t1 = ThreadClass(outputs_dict_split1)
    t2 = ThreadClass(outputs_dict_split2)
    t1.start()
    t2.start()
    t1.join()
    t2.join()
    outputs_dict_split1 = t1.outputs_dict_split
    outputs_dict_split2 = t2.outputs_dict_split
    outputs_dict_split_list.append(outputs_dict_split1)
    outputs_dict_split_list.append(outputs_dict_split2)
    outputs_dict = ChainMap(*outputs_dict_split_list)

    ### Downstream Processing ###

【问题讨论】:

谢谢。这实际上有效 - 处理时间显着减少 - 但只有当我将设备数量增加到超过我用于测试的两个时。我不确定这是什么原因。 【参考方案1】:

这确实有效。但是,我必须扩展正在处理的设备数量才能看到整体处理时间的显着改进。

【讨论】:

以上是关于Pexpect 多线程空闲状态的主要内容,如果未能解决你的问题,请参考以下文章

Java-多线程第四篇线程池

python多线程并行计算通过向线程池ThreadPoolExecutor提交任务的实现方法

JAVA多线程之AQS

JAVA多线程基础

睡眠方法和多线程的产量方法有什么区别?

多线程与多进程的实现