def run(self):
context = pyudev.Context()
monitor = pyudev.Monitor.from_netlink(context)
monitor.filter_by(subsystem='net')
monitor.start()
# Initial replay on existing interfaces
for device in context.list_devices(subsystem='net'):
self._dev_add(device.sys_name)
self.devices.add(device.sys_name)
while True:
# monitor.poll() is synchronized call, which will block eventlet
# for certain time. So use select to avoid the stall.
ready, _, _ = select.select([monitor.fileno()], [], [], timeout=10)
if ready:
device = monitor.poll(timeout=1)
if device.action == 'add':
self._dev_add(device.sys_name)
self.devices.add(device.sys_name)
elif device.action == 'remove':
self._dev_del(device.sys_name)
self.devices.remove(device.sys_name)
else:
eventlet.sleep()
评论列表
文章目录