2

私の問題はサブプロセスの終了です。マルチプロセスライブラリを使用し、リターンラインまたはエグジットラインのあるマシンでは、プロセスは結合前に終了しますが、別のマシンでは終了しません。プロセスは常に成長し、どちらもその仕事を終えた後に終了しません。どちらのマシンでも、Pythonのバージョンは2.7.3rc2です。

semaphore_processes_limit = BoundedSemaphore(value=PROCS_LIMIT)

# Starting searches
procs = []
for word in words:
    semaphore_processes_limit.acquire()
    p = Process(target=searching, args=(word,))
    procs.append(p)
    p.start()

# Wait for all worker processes to finish
for p in procs:
    p.join()

# Process
def searching(word):
return # or exit(0)

ありがとうございました。

4

3 に答える 3

1

こんにちは私はこれらの2台のマシンで同じ問題を再現しようとしました:

Python 2.6.7(r267:88850、2012年2月2日、23:50:20)Vista上のCygwin

Python 2.7.3(デフォルト、2012年8月1日、05:16:07)Ubuntu 12.04

どちらもp.join()の後で正しく終了しました。

説明1:ただし、PROCS_LIMITをlen(words)よりも小さい数値に下げると、最後のプロセスが終了しません。

説明2:セマフォは、ホストオペレーティングシステムごとに異なる方法で処理できます。したがって、異なる結果が得られます。このページの上部にある警告を参照してください:http://docs.python.org/2/library/multiprocessing.html

以前は、スレッドのサポートが不足しているため、Cygwin上のPythonのサブプロセスモジュールで問題が発生していました。

実行しているマシンの種類とオペレーティングシステムについて説明してください。

これは、コードを実行するためにコードに加えた変更です。

from multiprocessing import *
from threading import *

# Process
def searching(word):
    print(word)
    return # or exit(0)

PROCS_LIMIT = 5
semaphore_processes_limit = BoundedSemaphore(value=PROCS_LIMIT)

# Starting searches
words = ["foo", "bar", "baz", "buz", "biz"]
procs = []
for word in words:
    semaphore_processes_limit.acquire()
    p = Process(target=searching, args=(word,))
    procs.append(p)
    p.start()

# Wait for all worker processes to finish
for p in procs:
    p.join()
于 2012-11-15T11:35:45.010 に答える
1

最後にサーバーエラーが発生しましたが、何がわかりません。

ここでは、低いPROCS_LIMITを使用できるように、セマフォのリリースを使用してkuggの例を記述します。

from multiprocessing import *

PROCS_LIMIT = 2
semaphore_processes_limit = BoundedSemaphore(value=PROCS_LIMIT)

# Process
def process(word):
    print(word)
    semaphore_processes_limit.release()
    return

# Starting searches
words = ["foo", "bar", "baz", "buz", "biz"]
procs = []
for word in words:
    semaphore_processes_limit.acquire()
    p = Process(target=process, args=(word,))
    procs.append(p)
    p.start()

# Wait for all worker processes to finish
for p in procs:
    p.join()
于 2012-11-21T12:45:15.723 に答える
0

サーバーには12個のCPU(Intel(R)Core(TM)i7-3930K CPU @ 3.20GHz、1200 MHz)があり、GNU / LinuxDebianWeezyがインストールされています。

私の一時的な醜い解決策は次のとおりです。

os.kill(os.getpid(), 9)
于 2012-11-21T12:07:11.773 に答える