gpt4 book ai didi

python - 使用多处理时实例变量未更新 Python

转载 作者:太空宇宙 更新时间:2023-11-04 08:49:00 26 4
gpt4 key购买 nike

我在更新变量方面遇到了一个不寻常的问题。我构建了一个简单的类对象来帮助我进行一些网络嗅探。我想做一个并行过程,它允许我运行一些网络测试并捕获使用 python 生成的流量,这样我就可以扩展程序来做一些令人惊奇的事情。我正在使用 scapy 的嗅探功能来帮助进行界面嗅探。

Scapy 的嗅探器允许您将一个函数传递给它自己的函数,该函数允许您创建“停止嗅探”条件。在我的例子中,我创建了函数 stop_filter 并且我希望通过简单地更新 self.stop_sniffing 实例变量来停止 Scapy sniff 函数。我在下面展示了程序输出,它显示 self.stop_sniffing 在函数 stop 中设置为 True,但随后又设置回 False(或者根本没有更新) 在 stop_filter 中打印时。我不知道为什么会这样,也没有想到解决方案,因为这是一个很奇怪的问题。

如果有新鲜眼光的人能看到我在这里做了什么疯狂的事情,将不胜感激!

from scapy.all import *
from multiprocessing import Process


class DatasetSniffer:
def __init__(self, iface, local_dir='.'):
self.iface = iface
self.master = None
self.local_dir = local_dir
self.stop_sniffing = False # Never updates! why!?
self.writer = PcapWriter(local_dir+"/master.pcap", append=True, sync=True)

def stop_filter(self, p):
# Note: 'p' gets passed in by Scapy function 'sniff'
print self.stop_sniffing
# Return 'True' to stop sniffer
return self.stop_sniffing

def sniff(self):
sniff(store=0, prn=self.writer.write, iface=self.iface, stop_filter=self.stop_filter)

def start(self):
self.master = Process(target=self.sniff)
self.master.start()

def stop(self):
self.stop_sniffing = True
# Shows that self.stop_sniffing is 'True'
print self.stop_sniffing
self.master.join()


if __name__ == "__main__":
interface = 'en3'
sniffer = DatasetSniffer(interface)
sniffer.start()
# some process
time.sleep(5)
sniffer.stop()

外壳输出:

sudo python sniffing.py
False
False
False
False
False
False
False
False
False
False
False
False
False
False
False
False
True
False
False
False
False

最佳答案

问题

在此示例代码中您没有使用多个线程,您使用的是多个进程

这里有两个不共享内存的独立进程:

  • 原始流程
  • 一个新进程,由 multiprocessing.Process.start 启动

    • 此进程将通过 fork 原始进程开始,在 fork 时创建其内存的副本。他们不“共享”内存。

现在,当您在原始进程中调用 DatasetSniffer.stop 时,这不会改变新(“主”)进程中 stop_sniffing 的值。

那怎么沟通呢?

使用多处理时,您可以使用管道进行通信。像这样:

readable_pipe, writable_pipe = multiprocessing.Pipe(duplex=False)
process = Process(target=do_something)

现在,我们的原始进程可以通过写入管道来发送消息:

writable_pipe.send("stop")

虽然新进程可以使用以下方式检查消息:

if readable_pipe.poll():
msg = readable_pipe.recv()

尝试在您的代码中使用它。

关于python - 使用多处理时实例变量未更新 Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37412345/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com