[PHP-users 31428] Re: これは仕様?(sleep関数と非同期クエリ関数の関係)
kamiya 谷
djr_kamiya @ hotmail.com
2007年 2月 9日 (金) 14:10:10 JST
神谷です
花原さん、レスありがとうございます。
少々実務でテンパッテいてメールを確認していませんでした。
>コードを実際には実行していませんが、コードを見ただけなのです。
>もう解決しているかもしれませんね。
残念ながら、まだ解決はしていません。
>結論からいうと、「機能実装上のミス」のように思います(^_^;)。
ご指摘の点については、サンプルソースの問題なのですが、実コード
上は最初からsleepを行ったり・・・ということは当然のごとく試し
ていたので、その点について触れていませんでした。
現状確認できている状況で説明させていただくと
usleep( 1000 );を挟んだ場合は、クエリをpsql上で実行したときと、
ほぼ同じレスポンスで帰ってくる。(数秒)
usleep(2000000);を挟んだ場合は、数十分かかる。
という結果を得ています。
>まず、CPUの気持ちになって考えてください。
そのつもりで、非同期クエリを使用し、sleep()を挟んでいたのですが、
cpuに負荷をかけたときの方が結果的にレスポンスが良いということに
なっています。
最初の数秒だけめいっぱいループさせているのは、その間に結果が帰っ
てきていれば早く処理が行えるから・・・ということで、後からその
ような実装にしていました。
その辺の説明も省いてしまったのは良くないことですね。
>1秒より短いクエリーの場合は効率悪いですが、usleep使って検査周期を短くす
>るか、PHPではおそらく簡単には出来ないと思うけど、マルチスレッドなコー
>ドを書いてワーカースレッド内でpg_send_query()ではなく、pg_query()を使っ
>て、通知をメインスレッドに上げるとかすれば、パフォーマンスはあがります
>(別の問題を抱えてしまう可能性は大ですが... :-)。
一番初期のコードは、usleep間隔を0.1秒、ループを繰り返すごとに
0.1秒ずつusleep間隔を増やし、0.2秒、0.3秒・・・とし、最大で5秒
間隔まで増やす仕様としていました。
こうすることで、応答の良いクエリでも効率よく動作し、時間のかか
るクエリではcpuに余計な負担をかけずに済むだろうと思ったので。
それが、期待した結果とは全く違う状況になってしまい、かなり困っ
ているというのが現状です。
_________________________________________________________________
あの MSN がリニューアル!さらに使いやすくなりました http://jp.msn.com/
PHP-users メーリングリストの案内