I'm trying to read the URLs from a program running in a subprocess and then schedule an asynchronous HTTP request but it looks like the requests are running synchronously. Is that because subprocess and requests are both running in the same coroutine function?
test.py
import random
import time
URLS = ['http://example.com', 'http://example.com/sleep5s']
def main():
for url in random.choices(URLS, weights=(1, 1), k=5):
print(url)
time.sleep(random.uniform(0.5, 1))
if __name__ == '__main__':
main()
main.py
import asyncio
import sys
import httpx
from httpx.exceptions import TimeoutException
async def req(url):
async with httpx.AsyncClient() as client:
try:
r = await client.get(url, timeout=2)
print(f'Response {url}: {r.status_code}')
except Exception as TimeoutException:
print(f'TIMEOUT - {url}')
except Exception as exc:
print(f'ERROR - {url}')
async def run():
proc = await asyncio.create_subprocess_exec(
sys.executable,
'-u',
'test.py',
stdout=asyncio.subprocess.PIPE,
stderr=asyncio.subprocess.PIPE,
)
while True:
line = await proc.stdout.readline()
if not line:
break
url = line.decode().rstrip()
print(f'Found URL: {url}')
resp = await req(url)
await proc.wait()
async def main():
await run()
if __name__ == '__main__':
asyncio.run(main())
Test
$ python main.py
Found URL: http://example.com
Response http://example.com: 200
Found URL: http://example.com/sleep5s
TIMEOUT - http://example.com/sleep5s
Found URL: http://example.com/sleep5s
TIMEOUT - http://example.com/sleep5s
Found URL: http://example.com
Response http://example.com: 200
Found URL: http://example.com/sleep5s
TIMEOUT - http://example.com/sleep5s