有个需求,一个线程在得到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

很显然变成了异步执行了,但是却不能保证按照开启顺序执行,但是由于我的子线程不需要保证顺序执行,所以接下来也就不需要探究了。有解决方案的可以告知我一波。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐