0

streamSimulation을 2 개의 스레드로 4 번 나누어 호출하고 싶습니다.다른 스레드에서 코 루틴 루프를 실행하십시오.

어떻게 두 번째 루프를 만들고 두 번째 스레드를 만들고 그 스레드에서 루프를 실행할 수 있습니까?

import asyncio 
import functools 
from concurrent.futures import ThreadPoolExecutor 


async def streamSimulation(p1,p2,p3,p4): 
    print("Stream init") 
    while True: 
     await asyncio.sleep(2) 
     print("Stream Simulation") 
     print("Params: " + p1 + p2 + p3 + p4) 
     doSomething() 

def doSomething(): 
    print("Did something") 

def main(): 
    loop = asyncio.get_event_loop() 
    #Supposed to run in first thread 
    asyncio.ensure_future(streamSimulation("P1","P2","P3","P4")) 
    asyncio.ensure_future(streamSimulation("A1","A2","A3","A4")) 
    #Supposed to run in second thread 
    asyncio.ensure_future(streamSimulation("Q1","Q2","Q3","Q4")) 
    asyncio.ensure_future(streamSimulation("B1","B2","B3","B4")) 
    loop.run_forever() 

main() 

답변

0

아이디어가 비동기식으로 충돌합니다. 죄송합니다. 일반적으로

당신은 CPU 바운드 작업을 실행하기위한 주요 스레드 스레드 풀에서 하나의 이벤트 루프이 필요합니다.

단일 루프에 대한 이유는 : 그것은 IO가 결합 된 이다, IO/타이머 이벤트 기다리고 제외 을 차단해서는 안 루프에 의해 실행되는 코드입니다.

이것은 두 개의 루프가 성능 향상을 제공하지 않는다는 것을 의미합니다. 둘 다 커널 IO 하위 시스템에 의해 차단됩니다.

유일한 예외는 두 개의 서로 다른 이벤트 루프를 함께 만드는 것입니다. asyncio 및 Qt (그러나이 특별한 경우에는 qualmash 프로젝트가 있습니다).

+0

임 여러 개의 웹 소켓을 듣고 뭔가를 DB에 쓰려고합니다. 이것이 입술인가? – Arne

+0

같은 이벤트 루프에서 여러 웹 소켓을들을 수없는 이유는 무엇입니까? [aiohttp] (https://docs.aiohttp.org/en/stable/)는 그것을 할 수 있습니다. asyncio에는 지원되는 TCP 포트 크기에 대한 제한이 없습니다. –

+0

성능상의 이유. 나는 많은 트래픽 웹 소켓을 동시에 듣고 몇 가지 값을 집계하여 DB에 보내야합니다. 방금 GIL로 인해 멀티 스레딩이 성능을 향상시키지 않는다는 것을 깨달았습니다. 지금 멀티 프로세싱을 들여다 보면,'ProcessPoolExecutor'가 갈 길일 것 같습니다. 그러나'run_in_executor'로 동시 루틴을 실행하는 것은 불가능합니다. 현재 websockets 패키지를 사용 중입니다. – Arne

관련 문제