马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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() 函数。
|