質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Q&A

解決済

2回答

2144閲覧

マルチスレッドマルチスレッドのサンプルファイルを作ったがエラーになる

Casablanca_mtg

総合スコア209

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

0グッド

0クリップ

投稿2017/03/25 03:16

お世話になります
マルチスレッドマルチスレッドのサンプルファイルを作ったがnameエラーになり,どこが間違っているのかを知りたいです。

# -*- coding: utf-8 -*- import threading class LazyThread(threading.Thread): def run(self): import time time.sleep(1) try: withdraw_with_confirm(90) except ValueError: print('lazy_thread: NG %s' % balance) else: print('lazy_thread: OK %s' % balance) lazy_thread = LazyThread() lazy_thread.start() try: withdraw_with_confirm(20) except ValueError: print('current_thread: NG %s' % balance) else: print('current_thread: OK %s' % balance) lock = threading.Lock() balance = 0 def withdraw_with_confirm(money): global balance lock.acquire() try: if balance >= money: if raw_input('y/n?: ') == 'y': balance -= money return True return False else: raise ValueError() finally: lock.release()

よろしくお願いいたします

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

NameErrorはwithdraw_with_confirmに対して出ていますね。

withdraw_with_confirmの定義(def)より前にこれを呼び出そうとしているのが原因です。

pythonのプログラムはソースファイル上に書かれている順番に上から下へ順番に実行されます。従って関数の呼び出しや変数の参照はそれぞれ定義してから行うようにしないとNameErrorが起こります。

投稿2017/03/25 06:33

KSwordOfHaste

総合スコア18392

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Casablanca_mtg

2017/03/25 07:54

ありがとうございます ”ソースファイル上に書かれている順番に上から下へ順番に実行されます。従って関数の呼び出しや変数の参照はそれぞれ定義してから行うようにしないとNameErrorが起こります。”理解できました順番に実行されるということが大切ですね。何度やってもクリアしなかったのでお聞きしました。ありがとうございました
guest

0

以下のように処理順番を変えることでエラーは出なくなりました。
ただし意図した動作になっているかは分かりません。

Python

1# -*- coding: utf-8 -*- 2 3import threading 4 5lock = threading.Lock() 6balance = 0 7 8def withdraw_with_confirm(money): 9 global balance 10 lock.acquire() 11 try: 12 if balance >= money: 13 if raw_input('y/n?: ') == 'y': 14 balance -= money 15 return True 16 return False 17 else: 18 raise ValueError() 19 finally: 20 lock.release() 21 22class LazyThread(threading.Thread): 23 def run(self): 24 import time 25 time.sleep(1) 26 try: 27 withdraw_with_confirm(90) 28 except ValueError: 29 print('lazy_thread: NG %s' % balance) 30 else: 31 print('lazy_thread: OK %s' % balance) 32 33lazy_thread = LazyThread() 34lazy_thread.start() 35try: 36 withdraw_with_confirm(20) 37except ValueError: 38 print('current_thread: NG %s' % balance) 39else: 40 print('current_thread: OK %s' % balance) 41

投稿2017/03/25 06:32

can110

総合スコア38233

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Casablanca_mtg

2017/03/25 07:51

ありがとうございます。balance=0をbalance=100にしたら y/n?: n current_thread: OK 100 y/n?: y lazy_thread: OK 10 このように表示されました。 理解できました。ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問