0

私は基本的にポートスキャナーを書いています(実際にはそうではありませんが、近いです)。マシンを 1 台ずつ ping するのは単に遅いので、なんらかの並列処理が必要です。ボトルネックは間違いなくネットワークI/Oなので、(pythonのGILがあれば)スレッドで十分、使いやすいと思っていました。しかし、代わりにプロセスの使用率が大幅なパフォーマンスの向上 (15% 以上) をもたらすでしょうか?

悲しいことに、私は両方のアプローチを試して、いくつかの測定値または何かに基づいてより良いものを選択する時間がありません:/

ありがとう :)

4

3 に答える 3

2

パフォーマンス テストを待つ時間がない場合は、推測が必要なだけです。そう:

multiprocessingここに来るメリットはおそらくないthreading

multiprocessingタスクあたりのオーバーヘッドにデメリットがあります。バッチサイズを調整することでこれを回避できますが、threadingではその必要はありません。

したがって、スレッドを使用します。

ただし、 を使用して行うconcurrent.futures.ThreadPoolExecutorので、後で少し時間ができたら、 へのワンライナー変更を試してProcessPoolExecutorパフォーマンスを比較できます。

于 2013-02-27T20:17:55.477 に答える
1

これを潜在的な回答として投稿するだけだと思いました。
私はGeventのように使用しましたが、別のライブラリも機能します。

これは Gevent の Web サイトからの引用です。

import gevent
from gevent import socket
urls = ['www.google.com', 'www.example.com', 'www.python.org']
jobs = [gevent.spawn(socket.gethostbyname, url) for url in urls]
gevent.joinall(jobs, timeout=2)
[job.value for job in jobs]

['74.125.79.106'、'208.77.188.166'、'82.94.164.162']

これにより、スレッド/プロセスのオーバーヘッドなしで並行アプローチが可能になります =)

于 2013-02-27T20:18:16.157 に答える
0

一般的に言えば、マルチプロセッシングモジュールは、処理中に追加の CPU コアを利用する必要があります。各プロセスは独自の GIL を取得するため、特定の呼び出しがその期間中 GIL をロックするかどうかに関係なく、CPU 集中型の呼び出しを行うことができます。

プログラミングの観点から見ると、主な欠点は、共有メモリがはるかに少ないことです。multiprocessing.Array実際には、やなどの共有オブジェクトを使用してのみデータ ラウンドを送信できますmultiprocessing.Value。また、共有されるメモリが非常に少ないため、別のインスタンスを作成するたびに、メモリ フットプリントが 2 倍になります。

スレッドは実行可能なオプションかもしれませんが、最大の効率が必要な場合は、非同期アプローチを使用する必要があります。非同期ネットワーク I/O のフレームワークは多数ありますが、最もよく知られているのはおそらくTwistedです。

于 2013-02-27T20:16:54.313 に答える