0

URL のリストを取得し、各 URL にヘッダーを追加する関数があります。url_list は、約 25,000 の長いリストにすることができます。だから、私はマルチプロセッシングを使いたいです。私は失敗した2つの方法を試しました:

最初の方法- url_list が正しく渡されていません...関数は url_list url の最初の文字 'h' のみを取得します:

headers = {}
header_token = {}

def do_it(url_list):
    for i in url_list:
    print "adding header to: \n" + i
    requests.post(i, headers=headers)
    print "done!"

 value = raw_input("Proceed? Enter [Y] for yes: ")
    if value == "Y":
        pool = multiprocessing.Pool(processes=8)
    pool.map(do_it, url_list)
        pool.close()
        pool.join()

Traceback (most recent call last):
  File "head.py", line 95, in <module>
    pool.map(do_it, url_list)
  File "/usr/lib64/python2.7/multiprocessing/pool.py", line 250, in map
    return self.map_async(func, iterable, chunksize).get()
  File "/usr/lib64/python2.7/multiprocessing/pool.py", line 554, in get
    raise self._value
requests.exceptions.MissingSchema: Invalid URL u'h': No schema supplied

2 番目の方法は、ヘッダー ディクショナリをグローバルにする必要がないため、私が好む方法です。しかし、ピクルエラーが発生します:

def wrapper(headers):
    def do_it(url_list):
    for i in url_list:
        print "adding header to: \n" + i
        requests.post(i, headers=headers)
    print "done!"
    return do_it

    value = raw_input("Proceed? Enter [Y] for yes: ")
    if value == "Y":
        pool = multiprocessing.Pool(processes=8)
    pool.map(wrapper(headers), url_list)
        pool.close()
        pool.join()

Traceback (most recent call last):
  File "/usr/lib64/python2.7/threading.py", line 808, in __bootstrap_inner
    self.run()
  File "/usr/lib64/python2.7/threading.py", line 761, in run
    self.__target(*self.__args, **self.__kwargs)
  File "/usr/lib64/python2.7/multiprocessing/pool.py", line 342, in _handle_tasks
    put(task)
PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed
Traceback (most recent call last):
  File "/usr/lib64/python2.7/threading.py", line 808, in __bootstrap_inner
    self.run()
  File "/usr/lib64/python2.7/threading.py", line 761, in run
    self.__target(*self.__args, **self.__kwargs)
  File "/usr/lib64/python2.7/multiprocessing/pool.py", line 342, in _handle_tasks
    put(task)
PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed
4

2 に答える 2

1

2 番目の実装を使用する場合は、dillを使用してラッパー関数をシリアル化できるはずです。Dill は、Python でほとんど何でもシリアル化できます。Dill には、コードが失敗したときに pickle 化が失敗する原因を理解するのに役立ついくつかの優れたツールもあります。Dill は python の と同じインターフェースを持っていますが、pickleいくつかの追加メソッドも提供しています。でのシリアル化に dill を使用する場合は、次の手順をmultiprocessing実行する必要があります。

>>> import dill
>>> # your code goes here (as above)

そして、何らかの理由でそれが機能しない場合は、 dill を使用してマルチプロセッシングを実行するように構築されmultiprocessingpathosと交換できます。また、 multi-*argsmap関数 (標準の python とまったく同じmap) を提供します。

于 2013-10-14T15:00:00.430 に答える
0

multiprocessing パッケージの Queue を使用する必要があります。プルまたは追加するデータ型は、スレッドおよびプロセス セーフである必要があります。キューは両方です。

http://docs.python.org/2/library/queue.html

http://docs.python.org/2/library/multiprocessing.html#exchange-objects-between-processes

于 2013-08-27T22:26:19.710 に答える