【问题标题】:Is it possible to use an inline function in a Thread call?是否可以在 Thread 调用中使用内联函数?
【发布时间】:2016-05-16 15:15:51
【问题描述】:

threading.Thread(target=...) 的文档指出

target 是由 run() 方法调用的可调用对象。 默认为 None,表示不调用任何内容。

我通常是这样使用的:

import threading

def worker():
    a = 3
    print("bonjour {a}".format(a=a))

threading.Thread(target=worker).start()

有没有办法将target 中的函数元素链接起来,这样就不需要定义新的元素了? 类似(显然是伪代码)

threading.Thread(target=(a=3;print("bonjour {a}".format(a=a))).start()

我在Thread 调用中有一堆非常短的调用,并且希望避免函数定义的乘法。

【问题讨论】:

  • 你有什么反对定义函数的?
  • 没什么,这就是我今天的做法。不过,在一种情况下,我有 10 个不同的两个衬里(所以我不能使用 lambda,根据 @ForceBru 的回答)并且代码会更加紧凑和有条理,没有它们浮动。
  • 如果你定义一个函数作为线程的目标,你的代码更容易测试(你有测试,对吧?)。

标签: python multithreading


【解决方案1】:

我不太喜欢使用exec,但在 Python3.x 中它是一个函数,所以你可以这样做

threading.Thread(target=exec, args=('a=3; print("bonjour {a}".format(a=a))',)

【讨论】:

    【解决方案2】:

    您可以在 Python 3.x 中使用 lambda 函数

    import threading
    
    threading.Thread(target=lambda a: print("Hello, {}".format(a)), args=(["world"]))
    

    您可能应该看看this SO question,了解为什么不能在 Python 2.x 中的 lambda 表达式中使用 print


    实际上,您可以将许多函数调用放入您的lambda

    from __future__ import print_function # I'm on Python 2.7
    from threading import Thread
    
    Thread(target=(lambda: print('test') == print('hello'))).start()
    

    这将打印testhello

    【讨论】:

    • 完美,谢谢。我将删除我之前关于 lambda 中许多功能问题的评论,您的更新完美解决了这些问题。
    • 实际上,or 并不是一个好主意,因为如果第一个函数返回的布尔值为 true,则不会计算第二个函数,因此也不会调用第二个函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    • 1970-01-01
    • 2011-03-20
    • 1970-01-01
    • 1970-01-01
    • 2017-10-24
    相关资源
    最近更新 更多