指定线程数的方式实现python多线程及多线程获取返回值

举报
sydjcwx 发表于 2021/02/18 17:55:43 2021/02/18
【摘要】 # coding=utf-8import threading, time# 1、自己写代码实现,利用全局变量保存线程执行结果def get_detail_video(vid):    print('-->', vid)    time.sleep(2)datas = []ths = []for i in range(10):    th = threading.Thread(target=g...

# coding=utf-8
import threading, time


# 1、自己写代码实现,利用全局变量保存线程执行结果



def get_detail_video(vid):
    print('-->', vid)
    time.sleep(2)

datas = []
ths = []

for i in range(10):
    th = threading.Thread(target=get_detail_video, args=(i, datas,))
    th.start()
    ths.append(th)
    if len(ths) >= 3:
        for t in ths:
            t.join()
        ths.clear()
for t in ths:
    t.join()



# 2、重写模块,直接获取每个线程执行结果

# coding=utf-8
from threading import Thread
import time


class MyThread(Thread):
    def __init__(self, func, args):
        super(MyThread, self).__init__()
        self.func = func
        self.args = args

    def run(self):
        self.result = self.func(*self.args)

    def get_result(self):
        try:
            return self.result
        except Exception:
            return None


def a(x, y):
    time.sleep(2)
    return x+y


def b(x, y):
    time.sleep(2)
    return x+y


at = []
t1 = MyThread(a, args=(1,2,))
at.append(t1)
t2 = MyThread(b, args=(10,20,))
at.append(t2)
print(len(at))

ss_tt = time.time()

for t in range(len(at)):
    aa = at[t]
    aa.start()

for t in at:
    t.join()

r1 = t1.get_result()
print(' MyThread__%s 耗时: %s, result = %s' % (1, time.time() - ss_tt, r1))
r2 = t2.get_result()
print(' MyThread__%s 耗时: %s, result = %s' % (2, time.time() - ss_tt, r2))


ss_tt = time.time()
r1 = a(1,2)
print(' MyThread__%s 耗时: %s, result = %s' % (1, time.time() - ss_tt, r1))

r2 = b(10,20)
print(' MyThread__%s 耗时: %s, result = %s' % (2, time.time() - ss_tt, r2))







# 3、 利用线程池 模块

import threadpool


excel_datas = [1, 2, 3]


def run_xhs(i):
    return i


# 回调函数,接受的参数(请求本身,和请求工作函数执行结果)可以省略  
spider_results = []

def get_result(tt_requests, result):
    global spider_results
    spider_results.append(result)

tt_pool = threadpool.ThreadPool(2)    # 指定线程数为2
tt_requests = threadpool.makeRequests(run_xhs, excel_datas, get_result)  # 函数名, 列表
for tt_req in tt_requests:
    tt_pool.putRequest(tt_req)
tt_pool.wait()

if spider_results:
    print('spider_results = ', len(spider_results))
    write_excel_data(spider_results, excel_name)


# spider_results =  3 [1, 2, 3]
 
 
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。