|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
- from threading import Thread
- from threading import Lock
- import time
- n = 100 #共100张票
- def task():
- global n
- mutex.acquire() #上锁
- # temp = n #赋值给临时变量
- # time.sleep(0.1) #休眠0.1秒
- # n = temp - 1 #数量减1
- time.sleep(0.1) #休眠0.1秒
- n = n-1
- print("购买成功,剩余%d张电影票"%n)
- mutex.release() #释放锁
- return ("购买成功,剩余%d张电影票"%n)
- if __name__ == "__main__":
- mutex = Lock() #实例化LOCK类
- t_list = [] #初始化一个列表
- for i in range(10):
- t = Thread(target=task) #实例化线程类
- t_list.append(t) #将线程实例存入列表中
- t.start() #创建线程
-
- for t in t_list:
- t.join() #等待子线程结束
- data = t.join()
- print("data ",data )
复制代码
怎么在主函数取回task的返回值? data 取回 none
这里的 [None] * 10 是创建一个包含 10 个 None 元素的列表。当我们使用 executor.map() 函数时,它需要将传递给 task() 函数的参数作为第二个参数。由于我们的 task() 函数没有接收任何参数,所以这里产生了错误。
为了修复这个问题,您可以将 task() 函数修改为接受一个参数(即使我们实际上不使用它)。下面是修改后的代码:
- from concurrent.futures import ThreadPoolExecutor
- import time
- from threading import Lock
- n = 100 # 共100张票
- mutex = Lock() # 实例化LOCK类
- def task(dummy): # 修改这里,添加一个参数
- global n
- global mutex
- with mutex: # 上锁
- time.sleep(0.1) # 休眠0.1秒
- n = n - 1 # 数量减1
- result = "购买成功,剩余%d张电影票" % n
- return result # 释放锁
- if __name__ == "__main__":
- with ThreadPoolExecutor(max_workers=10) as executor:
- # 提交任务并获取返回值
- results = list(executor.map(task, [None] * 10))
- for result in results:
- print(result)
- print("data ", results[-1])
复制代码
现在, task() 函数接受一个名为 dummy 的参数,但我们在函数内部并未使用它。这样, executor.map() 可以正常工作,因为它会将列表 [None] * 10 中的每个 None 元素作为参数传递给 task() 函数。
|
|