Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/29: Рейтинг темы: голосов - 29, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 05.04.2015
Сообщений: 33
1

Завершение программы

09.07.2018, 21:13. Показов 5419. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, есть, например, код:
Python
1
2
a, b = map(int, input().split())
print(a ** b)
для возведения а в степень b. Понятно, если пользователь вводит очень большие числа Python задумается надолго. Возможно ли сделать так, чтобы программа завершилась через 10 секунд, например, даже если функция (возведения в степень) не завершилась?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.07.2018, 21:13
Ответы с готовыми решениями:

Asyncio корректное завершение в случае непредвиденной остановки программы
Есть скрипт (выложен не полностью) @asyncio.coroutine def do_work(data): for adres, ip_list in...

IntelliTrace остается в процессах после закрытия программы. Правильное завершение программы?
Много (очень много) раз запускал программу, закрывал через крестик. Вдруг винда сообщает, что...

Завершение программы 1/0
Нужно сделать так чтобы на 1 программа продолжалась, а на 0 завершалась! // Функция.cpp:...

Завершение программы
Как сделать чтобы после выполнения кода программа не завершала свою работу? program Project1; ...

завершение программы
помогите сообразить #include <StdAfx.h> #include <iostream> #include <conio.h> #include...

7
563 / 303 / 189
Регистрация: 20.05.2016
Сообщений: 592
09.07.2018, 22:51 2
Для простых случаев и не шибко заморачиваясь
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# import signal
# import os
from threading import Timer
from _thread import interrupt_main
 
 
TIMEOUT = 10
 
 
def exit():
    # os._exit(1)  # внезапная смерть
    # os.kill(os.getpid(), signal.SIGINT)  # внезапная смерть
    interrupt_main()  # прощание с близкими, завещание
    print('break after', TIMEOUT, 'seconds...')
    
def fib(n):
    if n <= 2:
        return 1
    return fib(n-1) + fib(n-2)
 
def main():
    print(fib(70))
 
 
if __name__ == '__main__':
    breaker = Timer(TIMEOUT, exit)
    breaker.start()    
    try:
        main()
    except KeyboardInterrupt:
        pass
    else:
        breaker.cancel()
        print('done')
1
0 / 0 / 0
Регистрация: 05.04.2015
Сообщений: 33
09.07.2018, 23:49  [ТС] 3
Частенько работает, однако если main выглядит так:
Python
1
2
def main():
    print(1000000000000000 ** 10000000000000000)
то уже не обращает внимание
0
563 / 303 / 189
Регистрация: 20.05.2016
Сообщений: 592
10.07.2018, 00:55 4
Да, извиняюсь, ** - атомарная же операция...

В таком случае для гарантированного бряка придется выносить фию в отдельный процесс, и убивать его по истечении таймаута.
1
0 / 0 / 0
Регистрация: 05.04.2015
Сообщений: 33
10.07.2018, 11:13  [ТС] 5
Наверное я что-то сделал не так, посмотрите, пожалуйста:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import threading
 
TIMEOUT = 1
 
 
class MyThread(threading.Thread):
 
    def run(self):
        # while True:
        #     pass
        return 1000000000000000 ** 10000000000000000
 
 
if __name__ == '__main__':
    t = MyThread()
    t.setDaemon(True)
    t.start()
    t.join(TIMEOUT)
Программа опять зависает, если считает 1000000000000000 ** 10000000000000000, однако из while True выходит, то есть проблема опять с тем же **. Может быть возможно избежать больших чисел как-то по-другому?
0
Просто Лис
Эксперт Python
5752 / 3546 / 1060
Регистрация: 17.05.2012
Сообщений: 10,385
Записей в блоге: 9
10.07.2018, 13:19 6
На какой ОС запускаете? Сделать батник, который будет убивать процесс через 10 секунд, да и всё.
1
563 / 303 / 189
Регистрация: 20.05.2016
Сообщений: 592
10.07.2018, 15:01 7
Лучший ответ Сообщение было отмечено Aleksey94 как решение

Решение

Один из вариантов, опять-таки не особо напряжный
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import multiprocessing
from multiprocessing import Pool as ProcessPool
 
TIMEOUT = 5
 
 
def run_with_timeout(f, timeout, *args, **kwargs):
    res = None
    with ProcessPool(processes=1) as pool:
        ares = pool.apply_async(f, args, kwargs)
        try:
            res = ares.get(timeout=timeout)
        except multiprocessing.TimeoutError:
            print('break after', timeout, 'seconds...', flush=True)
    return res
 
 
def main():
    a = 10000000000000000
    b = 10000000000000000
    return a ** b
 
 
if __name__ == '__main__':
    run_with_timeout(main, TIMEOUT)
Никогда не замечал, но если запустить такой код
Python
1
2
3
4
5
# import dis
 
def f():
    return 10000000000000000 ** 10000000000000000
# dis.dis(f)
(именно такой) питон вычисляет степень (версия 3.4, на других не пробовал) (он считает её на этапе компиляции и запихивает в константы, чтобы потом на этапе выполнения фии просто вернуть число)

Добавлено через 6 минут
О потоках. Чудный код по теме от alex925. Проблема в том, что поток не брякается, а продолжает молотить до конца, и прибить его можно только грубыми методами.
1
0 / 0 / 0
Регистрация: 05.04.2015
Сообщений: 33
10.07.2018, 21:46  [ТС] 8
shsv, Большое спасибо. Работает!
0
10.07.2018, 21:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.07.2018, 21:46
Помогаю со студенческими работами здесь

Завершение программы
Как завершить программу из другой функции(не Main)? Пробовал использовать system(&quot;exit&quot;);, но не...

БД. Завершение программы
Хочу попробовать для хранения данных программы-бота SQLite. Опыт работы с этой БД уже есть, однако...

Завершение программы
Добрый вечер. Хотел прояснить следующие моменты. Если программа пишется под DOS (на чистом асме...

Аварийное завершение программы
В общем, благодаря советам здешних форумчан, я таки осилил небольшую программку на малознакомом мне...

Аварийное завершение программы
#include &quot;B.h&quot; #include &quot;D1.h&quot; #include &quot;D2.h&quot; #include &lt;iostream&gt; #include &lt;typeinfo&gt; ...

Завершение программы из MainWindow
Здравствуйте, у меня такая проблема, что не могу понять как завершить программу не из мэйна При...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru