0

実行中の CGI スクリプトで次のエラーが発生します....

Traceback (most recent call last):, referer: http://mysite/cgi-bin/dev/testing.py
  File "/var/www/cgi-bin/dev/testing.py", line 908, in <module>, referer: http://mysite/cgi-bin/dev/testing.py
    webpage(), referer: http://mysite/cgi-bin/dev/testing.py
  File "/var/www/cgi-bin/dev/testing.py", line 899, in webpage, referer: http://mysite/cgi-bin/dev/testing.py
    getResults(form), referer: http://mysite/cgi-bin/dev/testing.py
  File "/var/www/cgi-bin/dev/testing.py", line 557, in getResults, referer: http://mysite/cgi-bin/dev/testing.py
    new_nums = processNums(nums), referer: http://mysite/cgi-bin/dev/testing.py
  File "/var/www/cgi-bin/dev/testing.py", line 328, in processNums, referer: http://mysite/cgi-bin/dev/testing.py
    t.start(), referer: http://mysite/cgi-bin/dev/testing.py
  File "/usr/lib64/python2.6/threading.py", line 471, in start, referer: http://mysite/cgi-bin/dev/testing.py
    _start_new_thread(self.__bootstrap, ()), referer: http://mysite/cgi-bin/dev/testing.py
  thread.error: can't start new thread, referer: http://mysite/cgi-bin/dev/testing.py

私のマシンの ulimit の問題かもしれませんが、皆さんと一緒にコードを確認したかったのです。これがスレッドに使用するコードです....

import Queue
import multiprocessing
from threading import Thread


def processNums(nums):
    new_nums = []

    queue = Queue.Queue()
    for num in nums:
        queue.put(num)

    thread_num = multiprocessing.cpu_count()
    for x in range(0,thread_num):
        t = Thread(target=multNum,args=(queue,new_nums,))
        t.setDaemon(True)
        t.start()

    queue.join()
    return new_nums


def multNum(queue,new_nums):
    while True:
        try: num = queue.get()
        except: break

        # do something....
        new_num = num*123456

        new_nums.append(new_num)
        queue.task_done()


print processNums([54,12,87,3268,2424,148,5,9877])

出力 [6666624、1481472、10740672、403454208、299257344、18271488、617280、1219374912]

これは私のコードの非常に骨抜きにされたバージョンです (ここにすべてをコピーすることはできません) が、私の問題はここにあると思われます。私の質問は...どうにかしてこれらのスレッドを閉じる必要がありますか? Pythonはそれを自動的に行いませんか?それとも、これは apache または Linux サーバーの構成の問題ですか? このエラーが表示されるのはこれが初めてですが、使用しているデータ セットでこのアプリケーションを実行するのも初めてです。このデータ セットは、数千のスレッドを生成します。ありがとう。

4

1 に答える 1

0

スレッドは、終了したら結合する必要があります。Thread.join()の Python ドキュメントを参照してください。

スレッドが結合されていない場合、そのスレッドはゾンビ プロセスとしてプロセス テーブルに残ります。

Linux ベースのシステムでは、pthread を使用して Python スレッド インターフェイスを実装します。への呼び出しpthread_createが失敗している可能性があります。マニュアルページから考えられる理由は次のとおりです。エラーである可能性がありEAGAINますが、エラー コードは Python スレッド インターフェイスからは取得できません。

  EAGAIN Insufficient  resources  to create another thread, or a system-imposed limit on the number of threads was encountered.
          The latter case may occur in two ways: the RLIMIT_NPROC soft resource limit (set via setrlimit(2)), which  limits  the
          number  of  process  for  a  real  user  ID,  was reached; or the kernel's system-wide limit on the number of threads,
          /proc/sys/kernel/threads-max, was reached.

   EINVAL Invalid settings in attr.

   EPERM  No permission to set the scheduling policy and parameters specified in attr.
于 2013-01-22T23:05:38.470 に答える