python 线程异步执行踩坑
有个需求,一个线程在得到n个数据之后,异步地执行一个子线程函数,在子线程函数中完成数据库的打开、写入数据、关闭操作。在子线程函数返回前父线程先返回结果。version1百度了一下,参考这篇文章:python线程实现异步任务这个代码的执行结果如下:def update_mysql(id):executor.submit(do_update)return "ok" + str(id)def do_up
·
有个需求,一个线程在得到n个数据之后,异步地执行一个子线程函数,在子线程函数中完成数据库的打开、写入数据、关闭操作。在子线程函数返回前父线程先返回结果。
在此之前,先导入我们需要的模块:
from concurrent.futures import ThreadPoolExecutor
import time
executor = ThreadPoolExecutor()
version1
百度了一下,参考这篇文章:python线程实现异步任务
这个代码的执行结果如下:
def update_mysql(id):
executor.submit(do_update)
return "ok" + str(id)
def do_update():
time.sleep(3)
print('start update')
time.sleep(1)
print("end")
return
print(update_mysql(1))
print(update_mysql(2))
print(update_mysql(3))
ok1
ok2
ok3
start update
start update
start update
end
end
end
version2
但是这个子线程函数是没有添加参数的,如果我这样写:
def update_mysql(id):
executor.submit(do_update(id))
return "ok" + str(id)
def do_update(id):
time.sleep(3)
print('start update' + str(id))
time.sleep(1)
print("end"+ str(id))
return
print(update_mysql(1))
print(update_mysql(2))
print(update_mysql(3))
结果如下:
start update1
end1
ok1
start update2
end2
ok2
start update3
end3
ok3
又变成同步了。
version3
后续又参考了这篇文章:python 之线程池传入多个参数的方法 ThreadPoolExecutor.submit 多参数支持
from concurrent.futures import ThreadPoolExecutor
import time
executor = ThreadPoolExecutor()
#调用方法
#实质就是通过lambda表达式过渡。传入的参数是一个,但是通过lambda表达多后拆散为多个传入。这是很巧妙的方法,实际 就是 *p 这个表达式。
def update_mysql(id):
args =[id,id,id]
executor.submit(lambda p: doFileParse(*p),args)
return "ok" + str(id)
def doFileParse(filepath,segment,wordslist):
time.sleep(3)
print(filepath)
time.sleep(1)
print(segment)
return
print(update_mysql(1))
print(update_mysql(2))
print(update_mysql(3))
结果如下:
ok1
ok2
ok3
2
1
3
2
1
3
很显然变成了异步执行了,但是却不能保证按照开启顺序执行,但是由于我的子线程不需要保证顺序执行,所以接下来也就不需要探究了。有解决方案的可以告知我一波。
更多推荐
所有评论(0)