Многопоточность с использованием фреймворка Python Bottle

Новичок в Python и потоковой передаче, поэтому я не уверен, происходит ли потоковая передача, как указано ниже -

Здесь я пытаюсь развернуть отдельный поток для каждого события. Новый поток должен создаваться, когда пользователь каждый раз нажимает кнопку «отправить», а затем выполняет его.

a.py файл:

from bottle import request, template,route,run,get,post
import sqlite3
import threading
import datetime

@route('/')
def index():
    return template('ins')

@post('/result')
def result():
    # print(request.body.read())  gives raw data
    result = request.forms
    usr_time = request.forms['usr_time']      #get all the values using keys
    A = request.forms.get('A')
    B = request.forms.get('B')
    C = request.forms.get('C')
    usr_hour,usr_mins = usr_time.split(":")


    with sqlite3.connect("database.db") as conn:
        cur = conn.cursor()

        cur.execute("CREATE TABLE IF NOT EXISTS bottable(hour TEXT, minutes TEXT, A TEXT, B TEXT, C TEXT)")
        cur.execute("INSERT INTO bottable(hour,minutes,A,B,C) VALUES (?,?,?,?,?)", (usr_hour,usr_mins,A,B,C))
        cur.execute("select * from bottable")
        data = cur.fetchall()       #get the whole table

        conn.commit()

    t1=threading.Thread(target=calc, args=(data,))    
    t1.start()  

    return template("result",result = result)

def calc(data):

    print(data)               #prints the whole table
    match_not_found=True
    while match_not_found:
        h=datetime.datetime.today().strftime("%H")              
        mi=datetime.datetime.today().strftime("%M")
        # z=[(i[2],i[3],i[4]) for i in data if i[0] == h and i[1]==mi]
        for i in data: 
            if i[0] == h and i[1]==mi:
                print ([j for j in i[2:5] if j != None])
                match_not_found=False
                break


if __name__ == '__main__':
    run(host='localhost',port=8080,debug='True',reloader='True')

ins.tpl:

<!DOCTYPE html>
<html>
<body>

<form action = "http://localhost:8080/result" method = "POST">
Select a time:
<input type = "time" name = "usr_time">
<br> <br>
<input type = "checkbox" name = "A" value = "A is on" >A </input>
<br>
<input type = "checkbox" name = "B" value = "B is on" >B </input>
<br>
<input type = "checkbox" name = "C" value = "C is on" >C </input>
<br><br>
<input type = "submit"> </input>
</form>


</body>
</html>

result.tpl:

<!doctype html>
<html>
   <body>

      <table border = 1>
         %for key, value in result.items():

            <tr>
               <th> {{ key }} </th>
               <td> {{ value }} </td>
            </tr>

         %end
      </table>

   </body>
</html>

И ins.tpl, и result.tpl хранятся в папке просмотров (потому что я использую бутылку). Я не уверен, создается ли каждый раз новый поток. Или есть способ лучше?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
1 319
1

Ответы 1

Код выглядит так, как будто он действительно запускает новый поток с каждой отправкой. Это легко проверить с помощью threading.enumerate ().

Похоже, что в calc () есть состояние гонки, когда несколько потоков конкурируют за доступ к стандартный вывод через функцию Распечатать(). Вы можете исправить это, объединив все выходные строки в одну строку и распечатав все сразу (или, лучше, создать очередь печати и выполнять печать в отдельном потоке).

Кроме того, есть потоки, многопроцессорность, очередь, а также пул. Я немного запутался, что и где их использовать. Могу ли я получить информацию о том, что нужно изучить, прежде чем я перейду к потокам / обработке?

Captain aaloo reportin' in 17.12.2018 09:58

@ Captainaalooreportin'in Вот ссылка на видео о подходах к параллелизму, youtube.com/watch?v=9zinZmE3Ogk, и вот слайды, pybay.com/site_media/slides/raymond2017-keynote/index.html

Raymond Hettinger 17.12.2018 11:18

Другие вопросы по теме