【问题标题】:The join() function in threading线程中的join()函数
【发布时间】:2014-10-10 07:27:20
【问题描述】:

所以我最近尝试理解 join() 函数,但是我阅读的许多教程/文档似乎并不理解它。有没有人可以给我解释一下?

【问题讨论】:

  • t.join() 将阻塞直到 t 对象完成它的 run 方法。不明白的地方能具体点吗?
  • @dano 什么会被阻止?还有其他话题吗?
  • 不,执行join的线程。也就是说,某个线程在名为t 的变量中引用了另一个线程,在该引用上调用join()。该调用会导致调用线程阻塞,直到引用的线程 (t) 完成运行。

标签: python multithreading python-3.x python-multithreading


【解决方案1】:

join多线程方法

关于线程和多线程连接的使用,您将使用t.join()。很简单,这一切为您做的就是您请求加入一个线程,该线程等待线程终止其运行。您的解释器将继续运行,直到所有线程终止。对于运行时间长的线程,做一个守护进程!也就是说,通过执行以下操作使线程成为守护进程:

t= Thread(target=entry, args=(5,), daemon=True)
t.start()

daemon=True 部分是该代码中唯一要显示给线程的重要部分,但如果需要,我可以扩展它。

这非常适合处理您正在运行的任何类型的后台任务。当主线程终止时,守护线程自动被淘汰。

join 字符串方法

要理解 join() 函数,直观地思考一下 Python 的创建者打算用这个命令做什么,将其命名为 join()... 他们想要创建一个可以加入“stuff”的命令并执行它灵活。想象一下“东西”是一堆字符串。现在想象一下,你想把它们放在一起,并以计算速度快的方式进行(稍后会详细介绍)假设你有很多这样的字符串,你会怎么做?您可以使用join() 以您希望的灵活方式组合字符串。通过灵活,您可以将字符串以空格、逗号或根本没有空格等分隔的方式组合在一起。例如,考虑以下不同字符串的列表:

my_list = ['I', 'love', 'join', 'so', 'much'] 

现在让我们看一些使用join() 灵活加入列表的示例(几乎以我们喜欢的任何方式):

','.join(my_list)

产生输出:

'I,love,join,so,much'

或者让我们试试这个:

''.join(my_list)

产生输出:

'Ilovejoinsomuch'

或者让我们试试这个例子:

' '.join(my_list)

产生输出:

'I love join so much'

请注意,在所有这些情况下,您的字符串列表是如何连接到一个字符串中的,并注意您可以如何准确指定您希望如何进行连接。现在join() 背后的真正力量在于,您希望加入的对象可以是各种不同的类型:字典、列表、元组、生成器等。难道不是非 Pythonic ;) 实现join() on所有这些不同的实体一次一个?这就是 Python 真正脱颖而出的地方,它能够将所有这些不同类型的结构连接在一起,而您只需坐下来告诉它您希望如何将对象连接在一起。这就是您的灵活性所在。

现在我想向您展示一个非常酷的示例,它能够使用生成器表达式将一堆不同的对象类型组合在一起:

my_list = ['I', 20, 'same']
print ' '.join(str(x) for x in my_list)

这将打印以下输出:

'I 20 same'

当然,您可以随意使用其他方法将字符串连接在一起。如果您只有几个字符串要加入,并且不需要像 join() 这样以计算速度快的方式进行,您可以使用 + 号。例如:

string1 = 'my string'
string2 = 'your string'

print(string1 + ' ' + string2)
print('{} {}'.format(string1,string2))

产生输出:

'my string your string'
'my string your string'

但是如果你有很多这样的字符串文字,你最好使用join() 来组合它们,这样你就不会遇到内存和垃圾收集等问题。

顺便说一句,如果你想知道你得到了什么样的输出(它是一个字符串,还是它到底是什么?),只需输入示例:

print type('{} {}'.format(string1,string2)) 

您的输出将是<type 'str'>,您就会知道!

希望这会有所帮助!

【讨论】:

  • str.join 与线程的join 方法无关。
  • @XYZ927 如果您有一个用于多线程的连接函数示例,那就太好了。
  • “但是,你不能加入守护线程”。这不是真的。你可以join 守护线程。当主线程退出时,守护线程不会自动加入。另外,这个:daemon=TRUE 应该是:daemon=True
  • @dano +1。已修复,谢谢。感谢您的反对。下次你也可以考虑编辑我的回复。
  • @TsumugiKotobuki 我在这里找到了一个非常棒的资源,展示了多线程连接函数的示例:pymotw.com/2/threading。如果您有任何问题,请告诉我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-27
  • 2013-02-11
  • 1970-01-01
相关资源
最近更新 更多