Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 3, 2017 16:19:26

Darkhan
Зарегистрирован: 2017-04-03
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Асинхронный запуск

Доброго времени суток, помогите пожалуйста вот с такой задачей. Нужно запустить два цикла одновременно. К примеру имеется две функции

 def loop1():
    for i in range(10):
        i += 1
        print (i)
def loop2():
    for i in range(10):
        i += 1
        print (i)
loop1()
loop2()
сейчас будет вывод от 1-10 и 1-10, т.е сначала первый цикл запустится потом второй, а нужно что запустились оба сразу, чтобы ответ был типа такого 1 2 1 3 2 3 4 4 и так далее и можно ли это сделать с помощью async?

Отредактировано Darkhan (Апрель 3, 2017 16:35:48)

Офлайн

#2 Апрель 4, 2017 07:54:51

scidam
Зарегистрирован: 2016-06-15
Сообщения: 288
Репутация: +  35  -
Профиль   Отправить e-mail  

Асинхронный запуск

Чтобы переключаться между функциями loop1 и loop2, вполне достаточно обычных генераторов и здесь совершенно не нужен никакой async:

 def loop1():
    for i in range(10):
        i += 1
        print('I am the loop1:', i)
        yield
def loop2():
    for i in range(10):
        i += 1
        print('I am the loop2:', i)
        yield
task1 = loop1()
task2 = loop2()
try:
    while True:
        next(task1)
        next(task2)
except StopIteration:
    pass

Если хотите одновременности, то это только multiprocessing:

 from multiprocessing import Process
def loop1():
    for i in range(10):
        i += 1
        print('I am the loop1:', i)
        
def loop2():
    for i in range(10):
        i += 1
        print('I am the loop2:', i)
p1 = Process(target=loop1)
p2 = Process(target=loop2)
p1.start()
p2.start()





Офлайн

#3 Апрель 4, 2017 14:38:11

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2828
Репутация: +  185  -
Профиль   Отправить e-mail  

Асинхронный запуск

https://habrahabr.ru/post/149420/



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#4 Апрель 4, 2017 16:41:31

Darkhan
Зарегистрирован: 2017-04-03
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Асинхронный запуск

scidam
Чтобы переключаться между функциями loop1 и loop2, вполне достаточно обычных генераторов и здесь совершенно не нужен никакой async:
спасибо большое, то что нужно, теперь другая проблема. У меня UI(User Interface) с полями логин и пароль и функция, которая отправляет запрос на авторизацию. Как сделать так, чтобы вот эта функция ждала пока не получит данные с полей логин и пароль и чтобы UI во время отправки запроса продолжал свою работу. А то я запускаю оба эти процесса (UI и отправка запроса) и получается, что функция еще не получила данные с полей логин и пароль, сразу же отправляет запрос на сервер

Офлайн

#5 Апрель 4, 2017 17:41:10

Darkhan
Зарегистрирован: 2017-04-03
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Асинхронный запуск

scidam
Чтобы переключаться между функциями loop1 и loop2, вполне достаточно обычных генераторов и здесь совершенно не нужен никакой async:
 import sys
import requests
from multiprocessing import Process
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtQuick import *
from PyQt5.QtQml import *
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from api import Api
# engine = create_engine('sqlite:///data/sim.db')
# Session = sessionmaker(bind=engine)
if __name__ == '__main__':
    # session = Session()
    class Gui(object):
        # myApp = None
        appLabel = None
        # ctx = None
        win = None
        login = None
        password = None
        button = None
    gui = Gui()
    api = Api()
    myApp = QApplication(sys.argv)
    gui.appLabel = QQmlApplicationEngine()
    ctx = gui.appLabel.rootContext()
    ctx.setContextProperty("main", gui.appLabel)
    def m_gui():
        # User Interface
        gui.appLabel.load('MessengerGUI/main.qml')
        gui.win = gui.appLabel.rootObjects()[0]
        gui.login = gui.win.findChild(QQuickItem, "login")
        gui.password = gui.win.findChild(QQuickItem, "password")
        gui.button = gui.win.findChild(QQuickItem, "button")
    def button_click():
        # When button clicked send auth request to server
        api.auth(gui.login.property('text'), gui.password.property('text'))
        print(api.access_token, api.home_server, api.user_id, api.device_id)
    m_gui()
    gui.button.clicked.connect(button_click)
    gui_process = Process(target=m_gui())
    button_process = Process(target=button_click())
    gui_process.start()
    button_process.start()
    gui.win.show()
    sys.exit(myApp.exec_())

Офлайн

#6 Апрель 5, 2017 07:14:34

scidam
Зарегистрирован: 2016-06-15
Сообщения: 288
Репутация: +  35  -
Профиль   Отправить e-mail  

Асинхронный запуск

Это все меняет. У меня нет достаточного опыта разработки GUI, а установить и попобовать сейчас Pyqt у меня нет возможности. Однако, сразу могу сказать, что много странных вещей:

1) странно, что класс Gui определен внутри __name__ == ‘__main__’; Вы планируете использовать программу как модуль, если нет, то вообще не нужно это условие __name__ == ‘__main__’

2) Gui класс – а зачем он, если у него нет методов; вместо класса Gui можно и так: gui = {'app_label': None, ‘win’: None, …} т.е. использовать просто словарь; скорее всего, конечно, класс нужен, с подходящими методами; но в рамках данной структуры программы – он не нужен.

3)

Как сделать так, чтобы вот эта функция ждала пока не получит данные с полей логин и пароль и чтобы UI во время отправки запроса продолжал свою работу

Полагаю, что здесь нужно задействовать event-loop у pyqt; где при заполнении полей login, passw, и нажатии клавиши запускалась функция, выполняющая авторизацию (асинхронно, или, наконец, в отдельном потоке).

Здесь встречаются спецы по GUI, надеюсь они ответят на Ваш вопрос.



Офлайн

#7 Апрель 5, 2017 10:19:30

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Асинхронный запуск

Darkhan
Как сделать так, чтобы вот эта функция ждала пока не получит данные с полей логин и пароль и чтобы UI во время отправки запроса продолжал свою работу.
ну так Qt событийно ориентированая система, определите событие(например нажали кнопку “войти”) и запускайте вашу процедуру авторизации тоько после этого события.
пишете отдельную процедуру типа def auth()
а в button_click() пишете уже чтото типа такого
 button_process = Process(target=auth())
button_process.start()

да я бы задумался о целесообразности запускать GUI в отдельном процессе, ИМХО это лишнее в вашем конкретном случае.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#8 Апрель 5, 2017 10:49:47

Darkhan
Зарегистрирован: 2017-04-03
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Асинхронный запуск

PEHDOM
Мне нужно добиться того, чтобы когда я отправлял запрос на сервер, GUI в это время работало. А то во время запроса на сервер и получения токена, GUI зависает и отвисвет только когда я получаю токен

Офлайн

#9 Апрель 5, 2017 15:44:48

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Асинхронный запуск

ну так и запускайте запрос в отдельном процессе, ГУЙ будет дальше продолжать работать как работал.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#10 Апрель 5, 2017 15:49:17

Darkhan
Зарегистрирован: 2017-04-03
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Асинхронный запуск

PEHDOM
ну так и запускайте запрос в отдельном процессе, ГУЙ будет дальше продолжать работать как работал.
это понятно, но вот оба потока не могут брать данные с одной переменной. Данные логин и пароль записываются в переменные управляющего потока, я не знаю как из второго потока получить данные с управляющего потока. Если тупо их вызывать из второго потока, то получается конфликт между потоками

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version