首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用多处理时未更新Python的实例变量

使用多处理时未更新Python的实例变量
EN

Stack Overflow用户
提问于 2016-05-24 11:32:13
回答 2查看 1.7K关注 0票数 1

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

Scapy的嗅探器允许您将一个函数传递到自己的函数中,该函数允许您创建“停止嗅探”条件。在我的例子中,我创建了函数stop_filter,我希望通过简单地更新self.stop_sniffing实例变量来停止sniff函数。我在下面介绍了程序输出,它显示了self.stop_sniffing在函数stop中被设置为True,但是当在stop_filter中打印时,会被设置为False (或者根本不更新)。我不知道为什么会发生这种情况,也没有想到任何解决办法,因为这是一个非常奇怪的问题。

如果任何人有新的眼睛可以看到我在这里做了多么疯狂的事情,这将是非常感谢!

代码语言:javascript
运行
复制
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()

外壳输出:

代码语言:javascript
运行
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-24 15:59:41

谢谢你的建议。经过一杯灵感之后,我成功地写出了这个剧本。也许是一个更好的方法来解决我的问题,而不做太多的改变。因此,这段代码允许线程在类之外使用停止函数,从而允许所有异步任务使用stop_filter

在下面的链接中找到此信息。希望这篇文章对其他人有帮助!multithreading.htm

干杯!

代码语言:javascript
运行
复制
import threading
from scapy.all import *
from datetime import datetime

directory = str(datetime.now().strftime("%Y%m%d%H%M%S"))
os.makedirs(directory)

DatasetSnifferExit = 0

class DatasetSniffer(threading.Thread):
    def __init__(self, iface, local_dir='.', filename=str(datetime.now())):
        self.iface = iface
        self.filename = filename
        self.local_dir = local_dir
        self.stop_sniffing = False
        self.writer = PcapWriter(local_dir+"/"+filename+".pcap", append=True, sync=True)
        threading.Thread.__init__(self)

    def run(self):
        sniff_interface(self.writer.write, self.iface)


def stop_filter(p):
    if DatasetSnifferExit:
        return True
    else:
        return False


def sniff_interface(write, iface):
    sniff(store=0, prn=write, iface=iface, stop_filter=stop_filter)


if __name__ == "__main__":
    DatasetSnifferExit = False
    # Create new threads
    pcap1 = DatasetSniffer('en3', directory, "master")
    pcap2 = DatasetSniffer('en0', directory, "slave")

    # Start new Threads
    pcap1.start()
    pcap2.start()

    # Do stuff
    time.sleep(10)

    # Finished doing stuff
    DatasetSnifferExit = True
票数 0
EN

Stack Overflow用户

发布于 2016-05-24 11:38:35

问题

在本示例代码中,您不使用多个线程,而是使用多个进程。

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

  • 原始过程
  • 一个由multiprocessing.Process.start启动的新过程
代码语言:javascript
运行
复制
- this process will have been started by forking the original process, creating a _copy_ of its memory at the time of the fork.  They do not "share" memory.

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

那么如何沟通呢?

使用multiprocessing时,可以使用Pipe进行通信。就像这样:

代码语言:javascript
运行
复制
readable_pipe, writable_pipe = multiprocessing.Pipe(duplex=False)
process = Process(target=do_something)

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

代码语言:javascript
运行
复制
writable_pipe.send("stop")

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

代码语言:javascript
运行
复制
if readable_pipe.poll():
    msg = readable_pipe.recv()

试着在你的代码中使用这个。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37412345

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档