[TurboGears] master.kidをいじると、"TypeError: 'NoneType' object is not callable"が発生する、ことがある。その4
環境
この現象は、TurboGears 1.0.1で確認しました。
はじめに
この記事は、id:SumiTomohiko:20070214:1171463510の続きです。
現象
id:SumiTomohiko:20070214:1171449131と同じです。
対策
CherryPyを再起動します。
原因
分かりません。
詳細
以下のようなシェルスクリプトtest.shで、現象が発生しないか調査しました。CherryPyを起動した後、touchコマンドでmaster.kidを更新し、Rubyスクリプトtest.rbでリクエストを送信します。
#!/bin/sh echo "$0 start." # CherryPyを起動する。 python start-car.py > /dev/null 2>&1 & # CherryPyが起動し終わるのを待つ。 sleep 30 # テストを実施する。 ruby test.rb > /dev/null 2>&1 n=$? echo "Before touch: ${n}" # master.kidを更新する。 touch car/templates/master.kid # テストを実施する。 ruby test.rb > /dev/null 2>&1 m=$? echo "After touch: ${m}" # CherryPyを停止する。 ps awx | grep "python start-car.py" | awk '{print $1}' | xargs kill -TERM exit `expr ${n} + ${m}` # vim: tabstop=2 shiftwidth=2 expandtab
test.rbは、以下の通りです。
# ruby require "open-uri" url = [ "/article/edit/", "/article/search/", "/article/list/", "/article/show/?id=1"] count = 0 error_url = [] 10.times do url.each do |s| begin address = "http://127.0.0.1:8080#{s}" open(address) rescue error_url.push(address) count += 1 end end end puts error_url puts count exit(count) # vim: tabstop=2 shiftwidth=2 expandtab
その結果、現象が再現しました。現象が発生したのは常にmaster.kidをtouchした後で、その前ではエラーにはなりませんでした。
次に、touchした後、CherryPyを再起動する次のtest-restart.shを実行しました。
#!/bin/sh echo "$0 start." # CherryPyを起動する。 python start-car.py > /dev/null 2>&1 & # CherryPyが起動し終わるのを待つ。 sleep 30 # テストを実施する。 ruby test.rb > /dev/null 2>&1 n=$? echo "Before touch: ${n}" # master.kidを更新する。 touch car/templates/master.kid # CherryPyを再起動する。 ps awx | grep "python start-car.py" | awk '{print $1}' | xargs kill -TERM python start-car.py > /dev/null 2>&1 & sleep 30 # テストを実施する。 ruby test.rb > /dev/null 2>&1 m=$? echo "After touch: ${m}" # CherryPyを停止する。 ps awx | grep "python start-car.py" | awk '{print $1}' | xargs kill -TERM exit `expr ${n} + ${m}` # vim: tabstop=2 shiftwidth=2 expandtab
その結果、エラーは発生しませんでした。
次のRubyスクリプトtest-all.rbによって、test.shとtest-restart.shを何度も実行してみましたが、結果は同じで、test.shではエラーが発生し、test-restart.shではエラーは発生しませんでした。
# ruby scripts = ["./test.sh", "./test-restart.sh"] error_count = [0, 0] 10.times do scripts.each_with_index do |script, i| puts "execute #{script}." `#{script}` error = $? >> 8 puts "error: #{error}" error_count[i] += error end end error_count.each_with_index do |count, i| puts "#{scripts[i]}: total_error_count=#{count}" end # vim: tabstop=2 shiftwidth=2 expandtab
以上より、master.kidを更新した後は、CherryPyを再起動した方がよいと思われます。