我如何多线程这个功能?我目前的语法有什么问题?

时间:2015-07-08 02:16:46

标签: python multithreading function

我当前对我的函数的单线程调用如下所示:

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函数的返回值。就像在单线程中一样。

2 个答案:

答案 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的互动方式才能完全理解。