Python 为什么在更改完成之前中断线程
我正在尝试创建python模块,用于通过IP地址获取MAC地址Python 为什么在更改完成之前中断线程,python,multithreading,Python,Multithreading,我正在尝试创建python模块,用于通过IP地址获取MAC地址 def getMACs(addressesList): def _processArp(pkt): spa = _inet_ntoa(pkt.spa) if pkt.op == dpkt.arp.ARP_OP_REPLY and spa in _cache.macTable: lock.acquire() try:
def getMACs(addressesList):
def _processArp(pkt):
spa = _inet_ntoa(pkt.spa)
if pkt.op == dpkt.arp.ARP_OP_REPLY and spa in _cache.macTable:
lock.acquire()
try:
_cache.macTable[spa] = _packedToMacStr(pkt.sha)
_cache.notFilledMacs -= 1
finally:
lock.release()
if _cache.notFilledMacs == 0:
thrd.stop()
addresses = _parseAddresses(addressesList)
_cache.registerCacheEntry("macTable", {})
_cache.registerCacheEntry("notFilledMacs", 0)
_events.arpPacket += _processArp
lock = threading.Lock()
thrd = _CaptureThread(promisc=False, timeout_ms=30, filter="arp")
thrd.start()
for addr in addresses:
if _sendArpQuery(addr):
_cache.macTable[str(addr)] = None
_cache.notFilledMacs += 1
thrd.join(125)
thrd.stop()
return _cache.macTable
if __name__ == "__main__":
macTable = getMACs([IPAddress("192.168.1.1"), IPAddress("192.168.1.3")])
_pprint.pprint(macTable)
当我运行这个模块时,我得到
{'192.168.1.1': '00:11:95:9E:25:B1', '192.168.1.3': None}
当我一步一步地调试processArp时,我得到
{'192.168.1.1': '00:11:95:9E:25:B1', '192.168.1.3': '00:21:63:78:98:8E'}
课程名称如下:
class CaptureThread(threading.Thread):
def __init__ (self, name=None, snaplen=65535, promisc=True, timeout_ms=0, immediate=False, filter=None):
threading.Thread.__init__(self)
self.__running = True
self.__name = name
self.__snaplen = snaplen
self.__promisc = promisc
self.__timeout_ms = timeout_ms
self.__immediate = immediate
self.__filter = filter
def stop(self):
self.__running = False
def run(self):
self.__pc = pcap.pcap(self.__name, self.__snaplen, self.__promisc, self.__timeout_ms, self.__immediate)
if self.__filter:
self.__pc.setfilter(self.__filter)
while self.__running:
self.__pc.dispatch(1, self.__processPacket)
def __processPacket(self, timestamp, pkt):
peth = dpkt.ethernet.Ethernet(pkt)
if isinstance(peth.data, dpkt.arp.ARP):
_events.arpPacket(peth.data)
愚蠢的错误。与使用线程时一样-因为线程同步
我中断线程的条件之一是“\u cache.notFilledMacs==0”。在主线程中,当CAPTURAREAD值减小时,cache.notFilledMacs没有时间获取2的值。\u此uuuu代码uuu是uuuu非常uuuuuu硬uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。可以我希望它们是模块级的,因为这可以解释用下划线开始它们的重要性。原因是什么?双下划线并不能取代私人密码。父类使用双下划线,以防止名称与其子类冲突,尤其是当父类由不同于子类的开发人员编写时。因此,一般来说,在python中,不允许不分青红皂白地使用双下划线或单下划线。更重要的是,您应该提供人们可以运行的代码,而不是不可命名的片段,期望人们只是眯着眼睛看它。请隔离您正在询问的问题,并提供一个自包含的代码块,我们可以将其复制到文件并进行测试。