2011-09-13 6 views
0

ノンブロッキングソケットからデータを受信するのに最適なスリープ値を探しています。例えば:ノンブロッキングコールのスリープ

while True: 
    data=s.recv(1024) 
    if not data: 
     time.sleep(10) #10ms 
    else: 
     pass #... 

ませ睡眠は、100%のCPU使用率につながるないので、最高のCPU使用率を取得し、帯域幅にする方法任意のアイデアでしょうか?どのくらいの時間スリープ状態になるので、CPUはスレッド切り替えを行うことができますか?

Btw、SO_SNDBUF/SO_RECVBUF経由でソケットのバッファを設定し、TCP_NODELAYを設定するのは理にかなっているのですか?

+0

パターンを解除します。今すぐ!関数sleep()が存在するのを忘れてしまいました。 'sleep()'を使うたびに、もっと適切な方法があります。 –

答えて

2

あなたはそれを自分で行うべきではありません。 selectコールを使用し、データが受信されなくても頻繁に起床する必要がある場合はタイムアウトを設定します。

ところで、TCP_NODELAYは送信側であり、readに影響しません。

+0

私の場合、ソケットは読み書き呼び出しを切り替えます。 recv/send/send/send/recv/recv/... –

1

selectを使用してください。基本的にはプログラムを一時停止し、ソケットで利用可能なデータがあるときに起動します。

+0

私はselect(...)を使うと、私が戻ってそれを受け取ろうとするときに、非ブロックソケットでデータがなくなると思っていました。 –

+1

@ミスター・ナンバーあなたはそのアイディアをどこで手に入れましたか?プログラミングエラーを起こさない限り、TCP/IPへのAPI経由でデータを失うことはできません。 – EJP

3

sleep()を使用する予定がある場合は、ブロッキングソケットを使用してください。

関連する問題