我的代码是下面代码的一个更复杂的版本。我会尽可能清楚地解释我想要什么。考虑我有以下代码。几个函数和数字列表。
def main_fun(number):
num = randint(1,10)
sleep(num)
return f"{num} --> {number}"
def fun_1(number):
print(f"fun_1 : {main_fun(number)}")
def fun_2(number):
print(f"fun_2 : {main_fun(number)}")
def fun_3(number):
print(f"fun_3 : {main_fun(number)}")
def fun_4(number):
print(f"fun_4 : {main_fun(number)}")
def fun_5(number):
print(f"fun_5 : {main_fun(number)}")
a = [1,2,3,4,5,6,7,8,9,10]
你可以看到有一个包含11个数字和6个函数的列表。Main_fun()是main函数。我想通过使用线程的其他5个函数调用main_fun()。
我希望脚本像这样工作,首先,这五个函数将像这样调用。(并行使用线程)我知道如何做到这一点。下一部分对我来说比较棘手。
fun_1(1)
fun_2(2)
fun_3(3)
fun_4(4)
fun_5(5)
可以看到main_fun()在返回一些东西之前会休眠一段时间。因此,假设通过fun_2()调用的main_fun()首先返回了一些东西。这意味着fun_2()完成运行,然后我想传递列表中的下一个数字(即6)并再次调用fun_2() (fun_2(6))。然后,下一个完成的函数需要用列表中的下一个数字作为参数来调用。我希望我解释得很清楚。在过去的两天里,我一直被这个问题困扰着。由于
我找到了一个解决方案。但不确定这是否是最有效的方式。在这里。我分享整个代码。
from random import randint
from time import sleep
import threading
def main_fun(number):
num = randint(1,10)
sleep(num)
return f"{num} --> {number}"
def fun_1(number):
print(f"fun_1 : {main_fun(number)}")
def fun_2(number):
print(f"fun_2 : {main_fun(number)}")
def fun_3(number):
print(f"fun_3 : {main_fun(number)}")
def fun_4(number):
print(f"fun_4 : {main_fun(number)}")
def fun_5(number):
print(f"fun_5 : {main_fun(number)}")
a = [1,2,3,4,5,6,7,8,9,10]
a_iter = iter(a)
thread_list = []
list_end = False
for fun in [fun_1,fun_2,fun_3,fun_4,fun_5]:
try:
num = next(a_iter)
thread = threading.Thread(target=fun,args=[num])
thread_list.append([thread,fun])
thread.start()
except StopIteration:
list_end = True
break
while not list_end:
try:
for ind, [thread, fun] in enumerate(thread_list):
thread: threading.Thread
if not thread.is_alive():
num = next(a_iter)
thread_list[ind] = [threading.Thread(target=fun,args=[num]),fun]
thread_list[ind][0].start()
except StopIteration:
list_end = True