模块化和可重用性开发:如何处理While真循环?

2024-09-27 20:19:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我最近一直在玩pybluez模块来扫描附近的蓝牙设备。我现在想做的是扩展程序,也找到附近的WiFi客户端设备。在

WiFi客户端扫描仪需要有一个While True环路来持续监控电波。如果我把它写成一个简单的,一个文件的程序,那就很容易了。在

import ...

while True:
    client = scan()
    print client['mac']

但是,我想要的是把它做成一个模块。我希望以后能够重用它,并且有可能让其他人也使用它。我搞不懂如何处理循环。在

^{pr2}$

假设第一个示例代码是“mymodule”,这个程序将简单地将数据输出到stdout。我希望能够在我的程序中使用这些数据,而不是让模块打印出来。。。在

我应该如何编码模块?在


Tags: 模块文件数据import程序clienttrue客户端
3条回答

我认为最好的方法是让扫描器在主程序之外的另一个线程上运行。该模块应具有启动和停止扫描仪的方法,以及返回当前访问点列表(使用锁进行同步)的另一个方法。参见threading module。在

两个接口会很有用。在

  1. scan()本身,它返回找到的设备的列表,这样我可以调用它来获得可用蓝牙的即时快照。它可能需要max_seconds_to_搜索或max_num_to_返回参数。在
  2. 一个接受回调的“notify on found”函数。例如(可能是打字错误,我只是即兴写下的)。在

    def find_bluetooth(callback_func, time_to_search = 5.0):
      already_found = []
      start_time = time.clock()
      while 1: 
        if time.clock()-start_time > 5.0: break
        found = scan()
        for entry in found:
          if entry not in already_found:
            callback_func(entry)
            already_found.append(entry)
    

    这样做会用到:

    def my_callback(new_entry):
      print new_entry    # or something more interesting...
    
    
    find_bluetooth(my_callback)
    

不如简单点,比如:

在我的模块.py在

import ...
def scanner():
    while True:
        client = scan()
        yield client['mac']

在其他模块.py在

^{pr2}$

如果你想要比这更有用的东西,我也建议使用@kindall那样的后台线程。在

相关问题 更多 >

    热门问题