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

Потоки python

09.04.2017, 20:40. Показов 1209. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет! Кто подскажет, как сделать так, чтобы программа задавала вопрос, и если за X секунд пользователь не ответит, то программа не записывала балл и задавала следующий вопрос, а если пользователь ответил и верно, то программа записывала Балли задавала следующий вопрос? Я знаю, что это с помощью модуля threading и time. (+, чтобы через каждые 10 секунд писалось, что осталось на 10 секунд меньше) версия python 3.6.1
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.04.2017, 20:40
Ответы с готовыми решениями:

Потоки в python
Всем доброго времени суток не давно стал изучать потоки в python и столкнулся с такими проблемами я...

Потоки Python
Ребята подскажите пожалуйста как реализовать бред препода в потоках пайтона: Вообщем надо...

Python - момент истины. Python - как оружие возмездие против системы
Какие модули в python мне нужны для взлома баз данных? Перехвата информации? Внедрения в систему? ...

Cx_freeze python error in main script как исправить- Python
Пытался создать из .py .exe , но при запуске .exe получаю ошибку вот код setup.py from cx_Freeze...

19
2740 / 2339 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
09.04.2017, 21:27 2
Цитата Сообщение от Slanix Посмотреть сообщение
Я знаю, что это с помощью модуля threading и time.
Не обязательно. Все зависит от используемоего фреемворка. На пример если ты используешь tkinter, то нужно использовать after.
0
0 / 0 / 0
Регистрация: 24.02.2017
Сообщений: 46
09.04.2017, 21:30  [ТС] 3
А как это сделать, не подскажете?
0
2740 / 2339 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
09.04.2017, 21:31 4
Цитата Сообщение от Slanix Посмотреть сообщение
А как это сделать, не подскажете?
Цитата Сообщение от alex925 Посмотреть сообщение
Все зависит от используемоего фреемворка
Пока о том, что ты делаешь, я знаю чуть больше чем ничего.
0
0 / 0 / 0
Регистрация: 24.02.2017
Сообщений: 46
09.04.2017, 21:43  [ТС] 5
Примерно так
(Писал с телефона, но на компе тоже самое)
Миниатюры
Потоки python  
0
2740 / 2339 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
09.04.2017, 21:53 6
То есть ты делаешь консольный тест?
0
0 / 0 / 0
Регистрация: 24.02.2017
Сообщений: 46
09.04.2017, 22:04  [ТС] 7
Да. Я пока что просто тренеруюсь.

Добавлено через 9 минут
Так что, поможете?
0
Эксперт Python
4634 / 2052 / 361
Регистрация: 17.03.2012
Сообщений: 10,134
Записей в блоге: 6
10.04.2017, 10:26 8
Цитата Сообщение от Slanix Посмотреть сообщение
Я знаю, что это с помощью модуля threading и time.
Уже хорошо. А документацию по этим словам посмотрели?
0
0 / 0 / 0
Регистрация: 24.02.2017
Сообщений: 46
10.04.2017, 19:40  [ТС] 9
Цитата Сообщение от dondublon Посмотреть сообщение
Уже хорошо. А документацию по этим словам посмотрели?
нужно чтото типо этого, только чтобы оба потока выполнялись в одно и то же время
import _thread
from time import sleep
def hel(): #описываем функцию, которую собираемся запустить параллельно основному потоку
sleep(2)
print('Hello,world!')
_thread.start_new_thread(hel,()) #запускаем функцию в качестве параллельного потока
sleep(5)
print('Done')
input()
0
Эксперт Python
4634 / 2052 / 361
Регистрация: 17.03.2012
Сообщений: 10,134
Записей в блоге: 6
11.04.2017, 09:09 10
Slanix, ну вот, всё же правильно понимаете.
0
0 / 0 / 0
Регистрация: 24.02.2017
Сообщений: 46
11.04.2017, 20:54  [ТС] 11
так то оно так, но почему-то дочерний поток (таймер) не запускается, пока что нибудь не ввести, а потом нельзя вводить ничего.
0
Эксперт Python
4634 / 2052 / 361
Регистрация: 17.03.2012
Сообщений: 10,134
Записей в блоге: 6
12.04.2017, 09:07 12
Slanix, давайте тут подробнее.
0
0 / 0 / 0
Регистрация: 24.02.2017
Сообщений: 46
12.04.2017, 20:04  [ТС] 13
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
import threading
import time
def c(n):
    ti = '15'
    while True:
        time.sleep(1)
        print('осталось',int(ti) - 1,'секунд')
        ti = int(ti) - 1
        if int(ti) == 0:
            print('Время вышло!')
        else:
            continue
def ans(ans):
    ans = input()
    if ans == '10':
        print(' верно ')
    else:
        print(' неверно ')
o = threading.Thread(target=ans, args=(1, ))
t = threading.Thread(target=c, args=(15, ))
print('сколько будет 5 + 5?')
print('у вас есть 15 секунд')
o.start()
t.start()
0
Эксперт Python
4634 / 2052 / 361
Регистрация: 17.03.2012
Сообщений: 10,134
Записей в блоге: 6
13.04.2017, 09:24 14
Хм. Я попробовал - всё запускается. Примерный вывод:
Код
сколько будет 5 + 5?
у вас есть 15 секунд
осталось 14 секунд
осталось 13 секунд
осталось 12 секунд
qwe
 неверно 
осталось 11 секунд
осталось 10 секунд
qwe
осталось 9 секунд
осталось 8 секунд
осталось 7 секунд
qweqwe
осталось 6 секунд
осталось 5 секунд
осталось 4 секунд
осталось 3 секунд
осталось 2 секунд
осталось 1 секунд
осталось 0 секунд
Время вышло!
осталось -1 секунд
осталось -2 секунд
осталось -3 секунд
осталось -4 секунд
осталось -5 секунд
осталось -6 секунд
осталось -7 секунд
осталось -8 секунд
осталось -9 секунд
осталось -10 секунд
осталось -11 секунд
осталось -12 секунд
осталось -13 секунд
осталось -14 секунд
осталось -15 секунд
осталось -16 секунд
осталось -17 секунд
осталось -18 секунд
осталось -19 секунд
осталось -20 секунд
qwe - это то, что я ввёл.
0
0 / 0 / 0
Регистрация: 24.02.2017
Сообщений: 46
13.04.2017, 18:50  [ТС] 15
Странно, у меня по другому работало...
0
2740 / 2339 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
13.04.2017, 23:34 16
Цитата Сообщение от Slanix Посмотреть сообщение
А как это сделать, не подскажете?
На базе этого можешь реализовать, что требуется тебе
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import functools
import threading
 
 
def timeout(seconds):
    def decorator(func):
        def run_with_timeout(*args, **kwargs):
            def target():
                """
                Обертка для выполенения функции в отдельном потоке
                """
                try:
                    result['returned'] = func(*args, **kwargs)
                except Exception as error:
                    result['error'] = error
 
            result = {'returned': None, 'error': None}
            worker = threading.Thread(target=target)
            worker.daemon = True
            try:
                worker.start()
                worker.join(seconds)
            except Exception as error:
                print('Error starting thread')
                raise error
 
            if result['error']:
                raise result['error']
            return result['returned']
 
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            if seconds == 0:
                return func(*args, **kwargs)
            else:
                return run_with_timeout(*args, **kwargs)
 
        return wrapper
    return decorator
 
 
@timeout(6)
def input_answer(question):
    return input(question)
 
answer = input_answer('Сколько будет 1 + 1: ')
if answer == '2':
    print('Правильно')
else:
    print('Неправильно')
1
563 / 303 / 189
Регистрация: 20.05.2016
Сообщений: 592
14.04.2017, 12:00 17
Цитата Сообщение от alex925 Посмотреть сообщение
На базе этого можешь реализовать, что требуется тебе
Не уверен (или я не правильно понял ТС).

Попробуйте, например, запустить
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
qwestions = [('Сколько будет 1 + 1: ',  2), 
             ('Сколько будет 1 + 2: ',  3),
             ('Сколько будет 1 + 3: ',  4),
             ('Сколько будет 1 + 4: ',  5),
             ('Сколько будет 1 + 5: ',  6),
             ('Сколько будет 1 + 6: ',  7),
             ('Сколько будет 1 + 7: ',  8),
             ('Сколько будет 1 + 8: ',  9),
             ('Сколько будет 1 + 9: ',  10),
             ('Сколько будет 1 + 10: ', 11),
             ('Сколько будет 1 + 11: ', 12),
            ]
 
for qwestion, right_answer in qwestions:
    answer = input_answer(qwestion)
    if answer == right_answer:
        print('Правильно')
    elif answer == 'q':
        print('done...')
        break
    else:
        print('Неправильно')
и "подумать" над первыми вопросами дольше заданного лимита. Будут плодиться потоки с input'ами, и чтобы восстановить нормальный ход выполнения скрипта, придется "вхолостую" жать Enter количество раз равное числу вопросов на которые вы подряд "не успели" ответить.

(Но код хороший, да)
1
2740 / 2339 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
14.04.2017, 14:38 18
shsv, такой вариант не проверял, спасибо. Подумаю, как можно решить проблему.
0
2740 / 2339 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
15.04.2017, 19:44 19
shsv, вот так ещё можно, но будет не кроссплатформенно. Только для linux.
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import signal
import functools
 
 
class ExceededError(Exception):
    pass
 
 
def timeout(seconds):
    def decorator(func):
        def _handle_timeout(signum, frame):
            raise ExceededError('Превышено время ожидания')
 
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            signal.signal(signal.SIGALRM, _handle_timeout)
            signal.alarm(seconds)
            try:
                result = func(*args, **kwargs)
            finally:
                signal.alarm(0)
            return result
 
        if seconds == 0:
            return func
        else:
            return wrapper
 
    return decorator
 
 
@timeout(3)
def input_answer(question):
    return input(question)
 
 
questions = [('Сколько будет 1 + 1: ', '2'),
             ('Сколько будет 1 + 2: ', '3'),
             ('Сколько будет 1 + 3: ', '4'),
             ('Сколько будет 1 + 4: ', '5'),
             ]
 
for question, right_answer in questions:
    try:
        answer = input_answer(question)
    except ExceededError as error:
        answer = None
    if answer == right_answer:
        print('Правильно')
    elif answer == 'q':
        print('done...')
        break
    else:
        print('Неправильно')
1
563 / 303 / 189
Регистрация: 20.05.2016
Сообщений: 592
16.04.2017, 22:10 20
Да, с виндовсом беда...

Наткнулся на чудный prompt_toolkit, который на первый взгляд обладает всем необходимым для кроссплатформенного осуществления задумки ТС, но либо я делаю что-то не так (предпочтительная причина), либо есть некие изъяны в коде модуля, либо просто windows... ( здесь было нудное нытье о странностях работы - по существу оно не работает - заветного параметра on_input_timeout ) Словом, надо разбираться...

Добавлено через 22 часа 47 минут
Нытье было напрасным - on_input_timeout работает... однако, если только, одновременно с ним, не задавать параметр refresh_interval, который нам нужен для отрисовки таймера. И который я сразу же запихнул в код, не подумав, что последуют, скажем так, недоразумения. Не дружат они...

В силу этого, а также шибко недавнего знакомства с означенным модулем, нижеследующий код (в количестве 2 штук) лишь набросок, который, тем не менее, работает (надеюсь в Linux тоже)
Без таймера; параметр on_input_timeout
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import prompt_toolkit.eventloop.base
 
from prompt_toolkit.shortcuts import (run_application, 
                                      create_prompt_application,
                                      create_eventloop)
from prompt_toolkit.buffer import AcceptAction
from prompt_toolkit.token import Token
from prompt_toolkit.document import Document
 
 
prompt_toolkit.eventloop.base.INPUT_TIMEOUT = 7
 
 
def get_prompt_tokens(cli):
    return [
        (Token.Prompt, '{}: '.format(cli.application.qwestion_u)),
    ]
 
 
def time_up(cli):
    cli.current_buffer.document = Document('', 0)
    cli.eventloop.stop()
 
 
def main():
    app = create_prompt_application(get_prompt_tokens=get_prompt_tokens)
    app.on_input_timeout = time_up
 
    qwestions = [('Сколько будет 1 + 1', '2'),
                 ('Сколько будет 1 + 2', '3'),
                 ('Сколько будет 1 + 3', '4'),
                 ('Сколько будет 1 + 4', '5'),
                 ('Сколько будет 1 + 5', '6'),
                 ('Сколько будет 1 + 6', '7'),
                ]
 
    for qwestion, right_answer in qwestions:
        app.qwestion_u = qwestion
        answer = run_application(app)
        if answer is None:
            print("Время вышло!")
        elif answer == right_answer:
            print("Верно")
        elif answer == 'q':
            print("break...")
            break
        else:
            print("Неверно")
 
 
if __name__ == '__main__':
    main()

С таймером; параметр refresh_interval
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import time
 
from prompt_toolkit.shortcuts import (prompt, run_application, 
                                      create_prompt_application,
                                      create_eventloop, print_tokens)
from prompt_toolkit.token import Token
from prompt_toolkit.styles import style_from_dict
from prompt_toolkit.document import Document
 
 
def get_prompt_tokens(cli):
    " Tokens to be shown before the prompt. "
    prompt = cli.application.qwestion_u
    timeleft = cli.application.timeout_u - time.time() + cli.application.start_u
 
    if timeleft <= 0:        
        timeleft = 0
        cli.current_buffer.document = Document('', 0)
        cli.eventloop.stop()
 
    return [
        (Token.Timer, '{:.1f}|'.format(timeleft)),
        (Token.Prompt, ' {}: '.format(prompt))
    ]
 
 
def main():
    app = create_prompt_application(get_prompt_tokens=get_prompt_tokens)
 
    app.tokens_u = {
        
        # "prompt": []
 
        "timeup": [
            (Token.TimeUp, 'Time up!'),
            (Token, '\n\n'),
         ],
 
        "rightanswer": [
            (Token.RigtAnswer, 'Правильно.'),
            (Token, '\n\n'),
         ],
 
        "wronganswer": [
            (Token.WrongAnswer, 'Неверно.'),
            (Token, '\n\n'),
         ],
 
        "break": [
            (Token, '\n'),
            (Token.Break, 'break...'),
            (Token, '\n'),
         ],
    }
 
    app.style = style_from_dict({
        Token.Timer: '#884444',
        Token.Prompt: '#000000',
        Token.TimeUp: '#ff0066',
        Token.RigtAnswer: '#000000',
        Token.WrongAnswer: '#000000',
        Token.Break: '#555855'
    })
 
    print_u = lambda prompt: print_tokens(app.tokens_u[prompt], style=app.style)
 
    qwestions = [('Сколько будет 1 + 1', '2', 3),
                 ('Сколько будет 1 + 2', '3', 4),
                 ('Сколько будет 1 + 3', '4', 5),
                 ('Сколько будет 1 + 4', '5', 6),
                 ('Сколько будет 1 + 5', '6', 7),
                 ('Сколько будет 1 + 6', '7', 8),
                ]
 
    for qwestion, right_answer, timeout in qwestions:
        app.qwestion_u = qwestion
        app.timeout_u = timeout
        app.start_u = time.time()
 
        answer = run_application(app, refresh_interval=.2)
 
        if answer is None:
            print_u("timeup")
        elif answer == right_answer:
            print_u("rightanswer")
        elif answer == 'q':
            print_u("break")
            break
        else:
            print_u("wronganswer")
 
 
if __name__ == '__main__':
    main()
0
16.04.2017, 22:10
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.04.2017, 22:10
Помогаю со студенческими работами здесь

Как из Python скрипта выполнить другой python скрипт?
Как из Python скрипта выполнить другой python скрипт? Если он находится в той же папке но нужно...

Не могу установить библиотеку pyqt5-tools python не получается через терминал и настройки и python itnerpritathor
Прошу помочь

Потоки в python
Посмотрел видеоуроки и не могу разобраться, что не так. f = open('links.txt', 'r') def...

Python потоки в сетях
Написать программу, которая находит максимальный поток в сети.Помогите пожалуйста.

Python и Pyqt5: потоки
Добрый день, программисты. Я начинающий программист. У меня есть такая задача: Есть окно...

Python socket telnet, потоки и ответ сервера
Добрый день всем. Возник вопрос, рассматриваю как общаться с python через telnet, имею код: ...


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

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