Найти - Пользователи
Полная версия: Асинхронный запуск
Начало » Python для новичков » Асинхронный запуск
1 2
Darkhan
Доброго времени суток, помогите пожалуйста вот с такой задачей. Нужно запустить два цикла одновременно. К примеру имеется две функции
 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?
scidam
Чтобы переключаться между функциями 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()





Rodegast
https://habrahabr.ru/post/149420/
Darkhan
scidam
Чтобы переключаться между функциями loop1 и loop2, вполне достаточно обычных генераторов и здесь совершенно не нужен никакой async:
спасибо большое, то что нужно, теперь другая проблема. У меня UI(User Interface) с полями логин и пароль и функция, которая отправляет запрос на авторизацию. Как сделать так, чтобы вот эта функция ждала пока не получит данные с полей логин и пароль и чтобы UI во время отправки запроса продолжал свою работу. А то я запускаю оба эти процесса (UI и отправка запроса) и получается, что функция еще не получила данные с полей логин и пароль, сразу же отправляет запрос на сервер
Darkhan
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_())
scidam
Это все меняет. У меня нет достаточного опыта разработки 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, надеюсь они ответят на Ваш вопрос.



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

да я бы задумался о целесообразности запускать GUI в отдельном процессе, ИМХО это лишнее в вашем конкретном случае.
Darkhan
PEHDOM
Мне нужно добиться того, чтобы когда я отправлял запрос на сервер, GUI в это время работало. А то во время запроса на сервер и получения токена, GUI зависает и отвисвет только когда я получаю токен
PEHDOM
ну так и запускайте запрос в отдельном процессе, ГУЙ будет дальше продолжать работать как работал.
Darkhan
PEHDOM
ну так и запускайте запрос в отдельном процессе, ГУЙ будет дальше продолжать работать как работал.
это понятно, но вот оба потока не могут брать данные с одной переменной. Данные логин и пароль записываются в переменные управляющего потока, я не знаю как из второго потока получить данные с управляющего потока. Если тупо их вызывать из второго потока, то получается конфликт между потоками
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB