RT =-=小白想要提升一下现在的一个任务的性能
假设我们有一个 api 多次调用的需求在一个 celery 的 task 里面
最普通的方法可以是这样:
@task
def foo():
for i in range(20):
call_api_here(i)
do_something_else()
但是这个很耗时因为会卡在 api 调用上
然后如果我们用 multiprocessing (不是一个好的注意,但是粗暴), celery 有自己的 library 叫做 billiard.
然后我们可以这样做
@task
def foo():
with Pool(5) as p:
p.map(call_api_here, some_params)
do_something_else()
但是这样的问题是,每一个 task 都会开启一个 pool 然后结束后这个 pool 并没有被释放,最终导致内存被各种占用
所以我想了另外一个办法,用 multithreading
def foo()
threads = []
for i in range(20):
t = threading.Thread(target=call_api_here, args=(i,))
threads.append(t)
for t in threads:
t.start()
for t in threads:
t.join()
但是试了下发现,虽然线程会随着进程结束而被销毁,但是貌似在每个 task 里面只有前几个线程执行了。。。后面的都 gg 了。。。
想问问各位大佬有什么好的方法嘛😂
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.