3

サンプルプログラムを書きました。8 つのスレッドを作成し、それぞれにプロセスを生成します。

import threading
from multiprocessing import Process

def fast_function():
    pass

def thread_function():
    process_number = 1
    print 'start %s processes' % process_number
    for i in range(process_number):
        p = Process(target=fast_function, args=())
        p.start()
        p.join()

def main():
    threads_number = 8
    print 'start %s threads' % threads_number
    threads = [threading.Thread(target=thread_function, args=()) 
            for i in range(threads_number)]

    for thread in threads:
        thread.start()

    for thread in threads:
        thread.join()

このようないくつかの例外でクラッシュします

Exception in thread Thread-3:
Traceback (most recent call last):
  File "/usr/lib/python2.6/threading.py", line 532, in __bootstrap_inner
    self.run()
  File "/usr/lib/python2.6/threading.py", line 484, in run
    self.__target(*self.__args, **self.__kwargs)
  File "./repeat_multiprocessing_bug.py", line 15, in thread_function
    p.start()
  File "/usr/lib/python2.6/multiprocessing/process.py", line 99, in start
    _cleanup()
  File "/usr/lib/python2.6/multiprocessing/process.py", line 53, in _cleanup
    if p._popen.poll() is not None:
  File "/usr/lib/python2.6/multiprocessing/forking.py", line 106, in poll
    pid, sts = os.waitpid(self.pid, flag)
OSError: [Errno 10] No child processes

Python バージョン 2.6.5。誰かが私が間違っていることを説明できますか?

4

2 に答える 2

1

マルチプロセッシング モジュールには、2.6.5 でスレッド セーフの問題があります。最善の策は、新しい Python に更新するか、このパッチを 2.6.5 に追加することです: http://hg.python.org/cpython/rev/41aef062d529/

このバグについては、次のリンクで詳しく説明されています。

于 2012-10-30T16:15:38.270 に答える
1

おそらく、対話型インタープリターから実行しようとしています。コードをファイルに書き込んで、Python スクリプトとして実行してみてください。私のマシンで動作します...

Python multiprocessing docsの説明と例を参照してください。

于 2012-08-28T12:49:07.847 に答える