Почему делает sys.exit () не, выходят при вызове в потоке в Python?

Я также предпочитаю CSS, а не HTML; HTML о содержании, CSS о представлении.

С помощью CSS у вас есть три варианта.

  1. Встроенный CSS (как в решениях Тревора и Диодея). Сложно поддерживать, и не гарантирует согласованности: вам придется проверить себя, что у каждого изображения одинаковая ширина и цвет границы.
  2. Внутренняя таблица стилей. Решает проблему согласованности для всех изображений на странице, имеющих class = "hasBorder", но вам нужно будет включить таблицу стилей для каждой страницы и снова убедиться, что "hasBorder" каждый раз определяется одинаково.
  3. Внешняя таблица стилей. Если вы включите ссылку на внешний CSS-файл на каждой странице , все изображений с class = "hasBorder" на всех страницах будут иметь одинаковую рамку.

Пример использования внутренней таблицы стилей:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
              "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Image with border</title>

<style type="text/css">
  img.hasBorder { border:15px solid #66CC33; }
</style>

</head>

<body>
  <img class="hasBorder" src="peggy.jpg" alt="" />
</body>
</html>

Если вы хотите внешнюю таблицу стилей, замените < style > ... < / style > блок с

<link rel="stylesheet" type="text/css" href="somestylesheet.css" />
80
задан Shabbyrobe 25 May 2009 в 03:10
поделиться

3 ответа

sys.exit () raises исключение SystemExit, как и thread.exit (). Итак, когда sys.exit () вызывает это исключение внутри этого потока, он имеет тот же эффект, что и вызов thread.exit (), поэтому завершается только поток.

61
ответ дан 24 November 2019 в 09:59
поделиться

Вас беспокоит тот факт, что печатается «pre main exit, post thread exit»?

В отличие от некоторых других языков (например, Java), где аналог sys.exit ( System.exit , в случае Java) вызывает немедленную остановку виртуальной машины / процесса / интерпретатора, Python sys.exit просто выдает исключение: в частности, исключение SystemExit.

Вот документы для sys.exit (просто print sys.exit .__ doc __ ):

Выйдите из интерпретатора, подняв SystemExit (status).
Если статус не указан или отсутствует, по умолчанию он равен нулю (т. Е. Успешно).
Если статус числовой, он будет использоваться как статус выхода из системы.
Если это объект другого типа, он будет напечатан и система
статус выхода будет единичным (то есть сбой).

Это имеет несколько последствий:

  • в потоке он просто убивает текущий поток, а не весь процесс (при условии, что он дойдет до вершины стека) ...)
  • деструкторы объектов ( __ del __ ) потенциально вызываются, когда кадры стека, которые ссылаются на эти объекты, разматываются
  • , наконец, блоки выполняются по мере разматывания стека
  • вы можете поймать SystemExit exception

Последнее, пожалуй, самое удивительное, и это еще одна причина, по которой вы почти никогда не должны иметь неквалифицированный оператор except в вашем коде Python.

11
ответ дан 24 November 2019 в 09:59
поделиться

Что делать, если я действительно хочу выйти из программы из потока (не то чтобы я на самом деле хотите, но насколько я понимаю)?

Мой предпочтительный метод - передача сообщений в стиле Erlang. Слегка упрощенно, я делаю это так:

import sys, time
import threading
import Queue # thread-safe

class CleanExit:
  pass

ipq = Queue.Queue()

def testexit(ipq):
  time.sleep(5)
  ipq.put(CleanExit)
  return

threading.Thread(target=testexit, args=(ipq,)).start()
while True:
  print "Working..."
  time.sleep(1)
  try:
    if ipq.get_nowait() == CleanExit:
      sys.exit()
  except Queue.Empty:
    pass
11
ответ дан 24 November 2019 в 09:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: