Прерываемый поток участвует в Python

s = r'abc123d, hello 3.1415926, this is my book'
print re.findall(r'-?[0-9]+(?:\.[0-9]*)?|-?\.[0-9]+',s)

Вам не нужно escape дважды, когда вы используете raw mode.

Выход: ['123', '3.1415926']

Также тип возврата будет списком strings .Если вы хотите, чтобы возвращаемый тип, как integers и floats, использовал map

import re,ast
s = r'abc123d, hello 3.1415926, this is my book'
print map(ast.literal_eval,re.findall(r'-?[0-9]+(?:\.[0-9]*)?|-?\.[0-9]+',s))

Выход: [123, 3.1415926]

23
задан phihag 10 March 2009 в 17:28
поделиться

3 ответа

Jarret Hardie уже упомянул это : Согласно Guido van Rossum , на данный момент нет никакого лучшего пути: Как указано в документация , join(None) блоки (и это не означает сигналов). Альтернатива - звонящий с огромным тайм-аутом (join(2**31) или так) и проверяющий isAlive большие взгляды. Однако способ, которым Python обрабатывает таймеры, имеет катастрофические последствия, как замечено при выполнении тестовой программы Python с servth.join(100) вместо servth.join():

select(0, NULL, NULL, NULL, {0, 1000})  = 0 (Timeout)
select(0, NULL, NULL, NULL, {0, 2000})  = 0 (Timeout)
select(0, NULL, NULL, NULL, {0, 4000})  = 0 (Timeout)
select(0, NULL, NULL, NULL, {0, 8000})  = 0 (Timeout)
select(0, NULL, NULL, NULL, {0, 16000}) = 0 (Timeout)
select(0, NULL, NULL, NULL, {0, 32000}) = 0 (Timeout)
select(0, NULL, NULL, NULL, {0, 50000}) = 0 (Timeout)
select(0, NULL, NULL, NULL, {0, 50000}) = 0 (Timeout)
select(0, NULL, NULL, NULL, {0, 50000}) = 0 (Timeout)
--- Skipped 15 equal lines ---
select(0, NULL, NULL, NULL, {0, 50000}Killing

Т.е. Python будит каждые 50 мс, ведя к единственному приложению, мешающему ЦП спать.

6
ответ дан Community 29 November 2019 в 02:51
поделиться

Потоки в Python являются несколько странными зверями, учитывая глобальную блокировку интерпретатора. Вы не можете быть в состоянии достигнуть того, что Вы хотите, не обращаясь к тайм-ауту соединения и isAlive, как eliben предполагает.

существует два места в документах, которые приводят причину для этого (и возможно больше).

первое:

От http://docs.python.org/library/signal.html#module-signal :

Некоторую заботу нужно соблюдать, если и сигналы и потоки используются в той же программе. Фундаментальная вещь помнить в использовании сигналов и потоков одновременно: всегда выполняйте сигнал () операции в основном потоке выполнения. Любой поток может выполнить предупреждение (), getsignal (), пауза (), setitimer () или getitimer (); только основной поток может установить новый обработчик сигналов, и основной поток будет единственным для получения сигналов (это осуществляется модулем сигнала Python, даже если базовая поддержка внедрения потока, отправляющая сигналы в отдельные потоки). Это означает что сигналы can’t использоваться в качестве средства сообщения межпотока. Используйте блокировки вместо этого.

второе, от http://docs.python.org/library/thread.html#module-thread :

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

РЕДАКТИРОВАНИЕ: было достойное обсуждение механики этого на средстве отслеживания ошибки Python здесь: http://bugs.python.org/issue1167930 . Конечно, это заканчивается Guido, говорящим: "Это вряд ли уйдет, таким образом, необходимо будет просто жить с этим. Поскольку Вы обнаружили, определив, что тайм-аут решает проблему (вид)". YMMV:-)

14
ответ дан Jarret Hardie 29 November 2019 в 02:51
поделиться

Опрос на isAlive прежде, чем звонить join. Этот опрос может быть прерван, конечно, и как только поток не isAlive, join непосредственно.

альтернатива опросила бы на join с тайм-аутом, сверившись isAlive, произошел ли тайм-аут. Это может потратить меньше ЦП, чем предыдущий метод.

3
ответ дан Eli Bendersky 29 November 2019 в 02:51
поделиться
Другие вопросы по тегам:

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