3

ソフトウェア アプリケーションを設計するために Python でコードを書いています。コードに次の機能を追加したい:

ユーザーがソフトウェアの使用を開始すると、ping()関数が実行され、インターネットに接続してデータを取得しようとします。ネットワークが利用できない場合は、ネットワークの可用性を継続的にチェックしてデータをフェッチする必要があります。それping()がネットワークを継続的にチェックしている間、私は私のソフトウェアアプリケーションに通常のことをさせたいと思っています。

私のコードは次のとおりです。

def ping():
    global lst1
    if network_connection() is True:
        links = lxml.html.parse("http://google.com").xpath("//a/@href")
        for url in links: 
            lst1.append(url)
    else:
        ping()

def network_connection():
        network=False
        try:
            response = urllib2.urlopen("http://google.com", None, 2.5)
            network=True

        except urllib2.URLError, e:
            pass
        return network

アプリケーションの起動時に呼び出しping()、関数内ping()で再帰呼び出しを行っています。その場合、ネットワーク接続が利用可能になり、アプリケーションが開始されなくなるまで、コードがこの再帰呼び出しでスタックするため、明らかに間違っています。

ネットワークの可用性をチェックし、残りのコードを同時に実行するという、両方のことを並べて実行できる方法はありますか?

4

3 に答える 3

1

まず第一に、別のプロセス/スレッドで発生する場合でも、継続的な ping は必要ありません。指数バックオフ アルゴリズムを使用する必要があります。

また、ネットワーク障害が発生した場合に ping プロセスで共有変数を更新して、ネットワークが稼働するまで、またはオフライン作業を行うまでメイン プロセスが待機するようにします。このために、コードは実行中に定期的に変数をチェックする必要があります。このタスクにはモジュールをお勧めします。multiprocessing

于 2013-07-26T20:33:36.227 に答える
1

whileloop を使用して、関数内のネットワークの可用性を常に確認することが簡単にできping()ます。コードがインターネット接続を継続的にチェックするときの CPU 使用率に関する Blue Ice の回答に完全に同意します。モジュールからの単一のtime.sleep()呼び出しtimeは、ループを抑制するのに十分です。

import time

def ping():
    global lst1
    status = True
    while(status):
        if network_connection() is True:
            links = lxml.html.parse("http://google.com").xpath("//a/@href")
            status = False
            for url in links: 
                lst1.append(url)
        else:
            time.sleep(0.1) #use 100 milliseconds sleep to throttke down CPU usage
于 2013-07-26T20:34:48.360 に答える