两个同步的Python循环,只有一个结果

时间:2011-09-28 20:58:31

标签: python gps queue python-multithreading gpsd

我目前有一段Python 2.6代码同时运行两个循环。该代码使用gps(gpsd)模块和scapy模块。基本上,第一个功能(gpsInfo)包含一个连续的while循环,从GPS设备抓取GPS数据并将位置写入控制台。第二个函数(ClientDetect)在一个连续循环中运行,也可以嗅探无线数据的空气,并在找到特定数据包时打印此数据。我已经将这两个循环与作为后台线程的GPS运行。我想要做的事情(并且已经苦苦挣扎了5天来解决方法)是这样的,当ClientDetect函数找到匹配并打印相应的信息时,我希望相应的GPS坐标也在打印时打印到安慰。目前我的代码似乎不起作用。

observedclients = [] p = ""  # Relate to wifi packet session =
gps.gps(mode=gps.WATCH_NEWSTYLE)

def gpsInfo():

    while True:
        session.poll()
        time.sleep(5)
        if gps.PACKET_SET:
            session.stream
            print session.fix.latitude + session.fix.longitude
            time.sleep(0.1)

def WifiDetect(p):
    if p.haslayer(Dot11):
        if p.type == 0 and p.subtype in stamgmtstypes:
            if p.addr2 not in observedclients:
                print p.addr2
                observedclients.append(p.addr2)  

def ActivateWifiDetect():
    sniff(iface="mon0", prn=WifiDetect)

if __name__ == '__main__':
    t = threading.Thread(target=gpsInfo)
    t.start()
    WifiDetect()

任何人都可以查看我的代码,看看在有wifi命中时如何最好地同时获取数据,同时打印GPS坐标?有人提到实施排队,但我已经研究了这个,但无法解决如何实现它。

如上所述,此代码的目的是扫描GPS和特定的wifi数据包,并在检测到时,打印与数据包相关的详细信息以及检测到的位置。

3 个答案:

答案 0 :(得分:2)

获得此功能的一种简单方法是将gps位置存储在全局变量中,并在需要打印某些数据时将wifi嗅探线程读取为全局;问题是因为两个线程可以同时访问全局变量,所以你需要用互斥量包装它;

last_location = (None, None)
location_mutex = threading.Lock()

def gpsInfo():
    global last_location
    while True:
        session.poll()
        time.sleep(5)
        if gps.PACKET_SET:
            session.stream
            with location_mutex:
                # DON'T Print from inside thread!
                last_location = session.fix.latitude, session.fix.longitude
            time.sleep(0.1)

def WifiDetect(p):
    if p.haslayer(Dot11):
        if p.type == 0 and p.subtype in stamgmtstypes:
            if p.addr2 not in observedclients:
                with location_mutex:
                    print p.addr2, last_location
                    observedclients.append((p.addr2, last_location))  

答案 1 :(得分:1)

当你在函数中使用gps时,你需要告诉python你正在使用外部变量。代码应如下所示:

def gpsInfo():
    global gps # new line

    while True:
        session.poll()
        time.sleep(5)
        if gps.PACKET_SET:
            session.stream
            print session.fix.latitude + session.fix.longitude
            time.sleep(0.1)


def WifiDetect(p):
    global p, observedclients # new line

    if p.haslayer(Dot11):
        if p.type == 0 and p.subtype in stamgmtstypes:
            if p.addr2 not in observedclients:
                print p.addr2
                observedclients.append(p.addr2)  

答案 2 :(得分:1)

我认为你的目标应该更具体。

如果您想要做的就是在嗅探Wifi网络时获得GPS坐标,只需执行(伪码):

while True:
    if networkSniffed():
        async_GetGPSCoords()

如果您想要记录所有GPS坐标并希望将其与Wifi网络数据相匹配,只需将所有数据与时间戳一起打印出来,并通过时间戳将后续处理与GPS坐标进行匹配。< / p>