1

Python /スレッドに慣れるための学習演習として、壁紙をダウンロードするスクリプトを作成しました。URLを要求しようとする例外がない限り、すべてがうまく機能します。これは私が例外をヒットした関数です(それが重要な場合、同じクラスのメソッドではありません)。

def open_url(url):
  """Opens URL and returns html"""
  try:
    response = urllib2.urlopen(url)
    link = response.geturl()
    html = response.read()
    response.close()
    return(html)
  except urllib2.URLError, e:
    if hasattr(e, 'reason'):
      logging.debug('failed to reach a server.')
      logging.debug('Reason: %s', e.reason)
      logging.debug(url)
      return None
    elif hasattr(e, 'code'):
      logging.debug('The server couldn\'t fulfill the request.')
      logging.debug('Code: %s', e.reason)
      logging.debug(url)      
      return None
    else:
      logging.debug('Shit fucked up2')      
      return None    

スクリプトの最後に:

  main_thread = threading.currentThread()
  for thread in threading.enumerate():
    if thread is main_thread: continue
    while thread.isAlive():
      thread.join(2)      
  break

私の現在の理解(間違っているかもしれません)から、スレッドが完了していない場合、これに到達してから2秒以内にタスクがタイムアウトするはずです。代わりに、それは最後の間に固執します。これを削除すると、スクリプトの実行が完了するとハングします。

また、デバッグツールを備えた実際のIDEにNotepad ++を残しておくときが来たと判断したので、Wingをダウンロードしました。私はWingの大ファンですが、スクリプトはそこにぶら下がっていません... Pythonを書くために皆さんは何を使っていますか?

4

2 に答える 2

0

Python にはスレッドの中断はなく、スレッドをキャンセルする方法もありません。単独で実行を終了することしかできません。メソッドはjoin2 秒または終了するまで待機するだけで、何も強制終了しません。スレッド自体にタイムアウト メカニズムを実装する必要があります。

于 2013-03-06T01:22:40.763 に答える
0

私は本を​​読んで、私が抱えていた問題を修正するのに十分なことを見つけました. スクリプトの終わり近くにあったコードを完全に削除することができました。スレッド プールを別の方法で生成することで、この問題を修正しました。

for i in range(queue.qsize()):
  td = ThreadDownload(queue)
  td.start()
queue.join()

また、スレッドの実行中にtry:forを使用していませんでした。queue.get()

  try:
    img_url = self.queue.get()
     ...
  except Queue.Empty:
     ...
于 2013-03-09T10:25:39.700 に答える