Python异步线程

threadpool模块

线程池

import threadpool
def say(what):
	"""
	调用的线程函数
	:params what: 说啥 
	:return 说啥:
	"""
	print(what)
	return what
	
	
size = 10 								# 线程数量
pool = threadpool.ThreadPool(threadnum) # 创建线程

word_list = ['you', 'are', 'a', 'sb']
requests = threadpool.makeRequests(startexam, word_list)	# 创建线程池对象
[pool.putRequest(req) for req in requests]		# 执行线程
pool.wait()										# 关闭线程池

使用步骤:

步骤代码解释
创建线程池(指定大小)线程池对象 = threadpool.ThreadPool(大小)申请一个的线程池对象
传递参数列表方法对象 = threadpool.makeRequests(函数名, 参数列表)让线程池把一个列表中的元素作为参数异步执行函数(尚未开始执行)
执行[线程池对象.putRequest(req) for req in 方法对象]把上面生成的传递参数后的方法创建并执行

过程:创建 => 传参 => 执行

multiprocessing模块

点击查看转载原文案例

多进程

import multiprocessing


def do(n):             # 参数n由args=(1,)传入
    name = multiprocessing.current_process().name        # 获取当前进程的名字
    print(name, 'starting')
    print("worker ", n)
    return


if __name__ == '__main__':
    numList = []
    for i in range(5):
        p = multiprocessing.Process(target=do, args=(i,))      # (i,)中加入","表示元祖
        numList.append(p)
        print(numList)
        p.start()                 # 用start()方法启动进程,执行do()方法
        p.join()                  # 等待子进程结束以后再继续往下运行,通常用于进程间的同步
        print("Process end.")
        

进程池

import time
from multiprocessing import Pool


def run(fn):
    # fn: 函数参数是数据列表的一个元素
    time.sleep(1)
    print(fn * fn)


if __name__ == "__main__":
    testFL = [1, 2, 3, 4, 5, 6]
    print('shunxu:')  # 顺序执行(也就是串行执行,单进程)
    s = time.time()
    for fn in testFL:
        run(fn)
    t1 = time.time()
    print("顺序执行时间:", int(t1 - s))

    print('concurrent:')  # 创建多个进程,并行执行
    pool = Pool(3)  # 创建拥有3个进程数量的进程池
    # testFL:要处理的数据列表,run:处理testFL列表中数据的函数
    pool.map(run, testFL)
    pool.close()  # 关闭进程池,不再接受新的进程
    pool.join()  # 主进程阻塞等待子进程的退出
    t2 = time.time()
    print("并行执行时间:", int(t2 - t1))
    

Pool类说明:
(Pool类可以提供指定数量的进程供用户调用,当有新的请求提交到Pool中时,如果池还没有满,就会创建一个新的进程来执行请求。如果池满,请求就会告知先等待,直到池中有进程结束,才会创建新的进程来执行这些请求)

方法说明
apply(func[, args=()[, kwds={}]])该函数用于传递不定参数,同python中的apply函数一致,主进程会被阻塞直到函数执行结束(不建议使用,并且3.x以后不再出现)
apply_async(func[, args=()[, kwds={}[, callback=None]]])与apply用法一致,但它是非阻塞的且支持结果返回后进行回调
map(func, iterable[, chunksize=None])Pool类中的map方法,与内置的map函数用法行为基本一致,它会使进程阻塞直到结果返回 (注意:虽然第二个参数是一个迭代器,但在实际使用中,必须在整个队列都就绪后,程序才会运行子进程)
map_async(func, iterable[, chunksize[, callback]])与map用法一致,但是它是非阻塞的
close(pool)关闭进程池(pool),使其不再接受新的任务
terminal()结束工作进程,不再处理未处理的任务
join()主进程阻塞等待子进程的退出, join方法要在close或terminate之后使用
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

左手八嘎呀路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值