我当前对我的函数的单线程调用如下所示:
deepdream(net, frame, end=layersloop[frame_i % len(layersloop)],iter_n = 5)
哪种方法效果很好。
但我想让它成为多线程的。现在我有一个看起来像这样的代码:
if threading.activeCount()>10:
frame = deepdream(net, frame, end=layersloop[frame_i % len(layersloop)],iter_n = 5)
else:
t = threading.Thread(target=deepdream, args=(frame,end=layersloop[frame_i % len(layersloop)],iter_n = 5)))
threads.append(t)
t.start()
这基本上使它保持少于10个线程。 (因此,如果线程数大于10,则只需执行一次线程调用。如果它的活动线程少于10个,则执行单线程调用。
但由于某种原因,我收到了这个错误:
File "3_dreaming_time.py", line 142
t = threading.Thread(target=deepdream, args=(frame,end=layersloop[frame_i % len(layersloop)],iter_n = 5)))
^
SyntaxError: invalid syntax
我是python的新手,并且不明白我的语法有什么问题。帮助
PS。我还希望变量frame
等于deepdream
函数的返回值。就像在单线程中一样。
答案 0 :(得分:1)
您错误地将关键字参数传递给threading.Thread()
以进行目标调用。试试这个:
t = threading.Thread(target=deepdream,
args=(frame,),
kwargs=dict(end=layersloop[frame_i % len(layersloop)],
iter_n=5))
答案 1 :(得分:0)
您的问题在于以下元组:
(frame,end=layersloop[frame_i % len(layersloop)],iter_n = 5)
您无法为元组提供默认值。它不是一个函数,所以参数默认值在这里没有意义。
尝试以下方法:
t = threading.Thread(target=deepdream, args=(frame,layersloop[frame_i % len(layersloop)],5)))
我想这里的问题是,在创建Thread
以运行函数(deepdream
)时,语法与仅调用没有Thread
的函数完全不同。你的用例不应该是一个问题,只需将你的行改为我给的那一行。
还要确保下面有:
for t in threads:
t.join()
此步骤将在结束程序之前等待线程完成。
对于您的frame
变量,每次都会传递给deepdream
。每次执行deepdream
函数时都可能会覆盖它。我们必须看到它与frame
的互动方式才能完全理解。