之前面试遇到这么一道有趣的题目,但是只给出一个输入用例,我写的代码可以通过这个输入用例,但是其它不知道的输入用例没法通过,不知道有没有大佬有啥思路吗?
这个是题目的链接: https://drive.google.com/drive/folders/1KQ6LYQcbhdINcVB1ChayloO01oXR1hF6?usp=sharing
import asyncio
def main():
async def do_sync_f():
return sync_f()
loop = asyncio.get_event_loop()
task_g = loop.create_task(async_g())
task_f = loop.create_task(do_sync_f())
tasks = [
task_g, task_f
]
loop.run_until_complete(asyncio.wait(tasks))
print(max(task_g.result(), task_f.result()))
if __name__ == '__main__':
main()
1
t133 2023-05-15 05:46:34 +08:00 via iPhone
有些 async 函数写的不好调用 run untill complete 你再调用 run untill complete 会出错
|
2
NoAnyLove 2023-05-15 05:53:32 +08:00 2
看了一遍题目,感觉你完全没理解这道题要考查什么。建议看看 https://docs.python.org/3/library/asyncio-task.html#running-in-threads ,另外,根据 python 版本不同,提供的函数不同。
|
3
whitewinds 2023-05-15 21:28:04 +08:00
你的这个写法并不正确,要知道 sync_f 里面的代码是会阻塞线程的,如果你 sync_f 和 async_g 都在主线程跑,那么如果 sync_f 先执行,event loop 就要等到 sync_f 解除阻塞才会执行 async_g ,那么 sync_f 和 async_g 并不 parallel ,你现在的代码之所以看起来并行,实际上是 async_g 先执行了,你可以在两个函数的开头写个 print 看看。
调用顺序对 event loop 的影响如下 import asyncio import time async def f(): time.sleep(3) async def g(): await asyncio.sleep(3) async def main(): start = time.time() # await asyncio.gather(f(), g()) # cost 6.006543159484863 # await asyncio.gather(g(), f()) # cost 3.0021119117736816 print(f"cost {time.time()-start}") asyncio.run(main()) 所以,这题中 sync_f 必须放到另外的线程执行 |
4
d29107d OP |
5
enrolls 2023-05-16 12:54:17 +08:00
博客欢迎赐教。或者问一下 ChatGPT 吧,它协助你,通关比较快。
|
6
likeyiyying 2023-05-16 15:53:54 +08:00
这是 GPT4 的回答,考察的应该是:asyncio.to_thread 这个知识点。
You can use asyncio.to_thread() to run the synchronous function sync_f() in a separate thread, allowing it to run concurrently with the asynchronous function async_g(). Here's how you can achieve this: python Copy import asyncio import threading import time def sync_f(a=None): lock = threading.Lock() lock.acquire(blocking=False) lock.acquire(timeout=3) return 2 async def async_g(a=None): await asyncio.sleep(3) return 1 async def main(): # Run sync_f() in a separate thread and async_g() concurrently sync_f_task = asyncio.to_thread(sync_f) async_g_task = async_g() results = await asyncio.gather(sync_f_task, async_g_task) print(results) if __name__ == "__main__": asyncio.run(main()) This code will run both sync_f() and async_g() concurrently, and print their results once both are completed. |