반응형

출처 : https://stackoverflow.com/questions/32456881/getting-values-from-functions-that-run-as-asyncio-tasks

asyncio 작업(task)으로 실행한 함수에서 값 얻어오기

저는 다음 코드를 작성하였습니다.

import asyncio

@asyncio.coroutine
def func_normal():
        print("A")
        yield from asyncio.sleep(5)
        print("B")
        return 'saad'

@asyncio.coroutine
def func_infinite():
    i = 0
    while i<10:
        print("--"+str(i))
        i = i+1
    return('saad2')

loop = asyncio.get_event_loop()

tasks = [
    asyncio.async(func_normal()),
    asyncio.async(func_infinite())]

loop.run_until_complete(asyncio.wait(tasks))
loop.close()

저는 이 함수의 변수에서 값들을 어떻게 얻는지 모르겠습니다. 다음처럼 했는데 안 됩니다.

asyncio.async(a = func_infinite())

위처럼 keyword 인자로 값을 넘겼습니다. 함수 리턴값을 얻으려면 어떻게 해야 할까요?


3개의 답변 중 1개를 추려냄

코루틴은 기존처럼 작동합니다. loop.run_until_complete()로부터 리턴 값을 바로 사용하시면 되고 여러개의 결과를 모으기 위해 asyncio.gather()를 호출 합니다.

#!/usr/bin/env python3
import asyncio

@asyncio.coroutine
def func_normal():
    print('A')
    yield from asyncio.sleep(5)
    print('B')
    return 'saad'

@asyncio.coroutine
def func_infinite():
    for i in range(10):
        print("--%d" % i)
    return 'saad2'

loop = asyncio.get_event_loop()
tasks = func_normal(), func_infinite()
a, b = loop.run_until_complete(asyncio.gather(*tasks))
print("func_normal()={a}, func_infinite()={b}".format(**vars()))
loop.close()

출력

--0
--1
--2
--3
--4
--5
--6
--7
--8
--9
A
B
func_normal()=saad, func_infinite()=saad2
반응형
반응형

출처 : https://stackoverflow.com/questions/54101923/1006-connection-closed-abnormally-error-with-python-3-7-websockets

python 3.7 websockets에서 비정상적으로 1006 접속 종료 오류

저는 python websockets에서 이러한 github 이슈와 같은 문제가 있습니다.
https://github.com/aaugustin/websockets/issues/367

제안된 해결책은 저는 작동하지 않습니다. 제가 본 오류는

websockets.exceptions.ConnectionClosed: WebSocket connection is closed: code = 1006 (connection closed abnormally [internal]), no reason

이는 제 코드입니다.

async def get_order_book(symbol):
    with open('test.csv', 'a+') as csvfile:
        csvw = csv.writer(csvfile, delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL)
        DT = Data(data=data, last_OB_id=ob_id, last_TR_id=tr_id, sz=10, csvw=csvw)

        while True:
            if not websocket.open:
                print('Reconnecting')
                websocket = await websockets.connect(ws_url)
            else:
                resp = await websocket.recv()
                update = ujson.loads(resp)
                DT.update_data(update)

async def get_order_books():
    r = requests.get(url='https://api.binance.com/api/v1/ticker/24hr')
    await asyncio.gather(*[get_order_book(data['symbol']) for data in r.json()])

if __name__ == '__main__':
    asyncio.run(get_order_books())

내가 테스트 한 방법은 인터넷 연결을 종료하는 것이지만 10초 후에도 여전히 1006 오류가 반환됩니다.

Python 3.7 및 Websockets 7.0을 실행하고 있습니다.

당신의 생각이 무엇인지 알려주십시오. 감사합니다!

5개의 답변 중 1개의 답변만 추려냄

저도 같은 문제에 직면했습니다. 잠시 동안 파고들자 다시 연결하라는 여러 버전의 답변을 찾았지만 합리적인 방법이라고 생각하지 않았으므로 더 파고 들었습니다.

DEBUG 레벨 로깅을 활성화하면 파이썬 웹소켓이 기본적으로 핑 패킷을 보내고 응답을 받지 못하면 연결 시간이 초과된다는 것을 알았습니다. 이것이 표준과 일치하는지 확실하지 않지만 적어도 파이썬 스크립트 시간이 초과되는 서버에는 적어도 자바 스크립트의 웹 소켓은 완전히 좋았습니다.

수정은 간단합니다. connect (연결)하기 위한 다른 kw 인수를 추가합니다.

websockets.connect(uri, ping_interval=None)

같은 인자는 서버쪽 함수 serve로 작동해야 합니다.

https://websockets.readthedocs.io/en/stable/api.html에서 정보를 더 얻을 수 있습니다.

반응형

+ Recent posts