質問

書い少しクローラーを取得するURLを複数回ったすべてのスレッドを同時走行(同).

立ちたいと思っていま少しのコードをなすべきます。

import thread
from urllib2 import Request, urlopen, URLError, HTTPError


def getPAGE(FetchAddress):
    attempts = 0
    while attempts < 2:
        req = Request(FetchAddress, None)
        try:
            response = urlopen(req, timeout = 8) #fetching the url
            print "fetched url %s" % FetchAddress
        except HTTPError, e:
            print 'The server didn\'t do the request.'
            print 'Error code: ', str(e.code) + "  address: " + FetchAddress
            time.sleep(4)
            attempts += 1
        except URLError, e:
            print 'Failed to reach the server.'
            print 'Reason: ', str(e.reason) + "  address: " + FetchAddress
            time.sleep(4)
            attempts += 1
        except Exception, e:
            print 'Something bad happened in gatPAGE.'
            print 'Reason: ', str(e.reason) + "  address: " + FetchAddress
            time.sleep(4)
            attempts += 1
        else:
            try:
                return response.read()
            except:
                "there was an error with response.read()"
                return None
    return None

url = ("http://www.domain.com",)

for i in range(1,50):
    thread.start_new_thread(getPAGE, url)

the apacheログはないようにスレッドの実行を同時にちょっとギャップ要求の、ほとんど検出すことはできなかったが、そのスレッドだ。

かつ吉は、のようなものを、バイパスで出かけ、C++のコードについて教えてください。できないからどんなスレッドが可能でGIL?pythonの基本的には通訳者は、次のスレッドとる仕上がりとなってい前ですか?

感謝。

役に立ちましたか?

解決

あなたが指摘するように、ギルはしばしばPythonスレッドが並行して実行されるのを防ぎます。

ただし、常にそうではありません。 1つの例外は、I/Oバウンドコードです。スレッドがI/Oリクエストが完了するのを待っている場合、通常、待機に入る前にGILをリリースします。これは、他のスレッドがその間に進歩することができることを意味します。

しかし、一般的には multiprocessing 真の並列性が必要な場合は、より安全な賭けです。

他のヒント

Gilについて読んだことがありますが、C C ++コードを呼び出すことなくバイパスする方法はありますか?

あまり。 CTYPESを介して呼び出される関数は、それらの呼び出しの期間中、GILをリリースします。 I/Oのブロックを実行する機能もリリースされます。他にも同様の状況がありますが、それらは常にメインのPythonインタープリターループの外側のコードを含みます。 Pythonコードでギルを手放すことはできません。

利用することができますアプローチのようなことをすべてのスレッド、待機状態オブジェクト、そして、このリニューアルに合わせて、取得のurl"同時に":

#!/usr/bin/env python
import threading
import datetime
import urllib2

allgo = threading.Condition()

class ThreadClass(threading.Thread):
    def run(self):
        allgo.acquire()
        allgo.wait()
        allgo.release()
        print "%s at %s\n" % (self.getName(), datetime.datetime.now())
        url = urllib2.urlopen("http://www.ibm.com")

for i in range(50):
    t = ThreadClass()
    t.start()

allgo.acquire()
allgo.notify_all()
allgo.release()

こうしてるんでビットを身近にすべてを取り出しが起こると同時に、 :

  • のネットワークパケットを離れのコンピュータ共有に向けた運営を行っていイーサネットワイヤを配列は同時に、
  • その場合16+コアを利用するマシンは、ルーター、ブリッジ、モデムやその他の設備と機械のウェブホストが少ないコア、serializeご要望
  • Webサーバだけを取得ら"を使用し accept() 電話お客さまのリクエストにお応えす正しい行動を実施するサーバー-グローバルロックを一つだけサーバプロセス/スレッドに対応しお返します。場合でも一部のサーバにリクエストが到着し 同時に, この原因の一部serialisation.

しょうがお得にご依頼 重なり より大(その他の開始前に仕上がりもだいすべてのご要望に 同時に開始す に、サーバーにコピーします。

また、ソフトウェアの移行メモリ(したがってGILを廃止する)があるPypyの未来のようなものを見ることができます。

JythonまたはIronpythonでコードを実行すると(そして将来的にはPypyかもしれません)、並行して実行されます

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top