使用threading.Thread.join()

Pra*_*hal 24 python multithreading python-multithreading python-2.7

我是python中多线程的新手,并尝试使用线程模块学习多​​线程.我做了一个非常简单的多线程程序,我无法理解该threading.Thread.join方法.

这是我制作的程序的源代码

import threading

val = 0

def increment():
   global val 
   print "Inside increment"
   for x in range(100):
       val += 1
   print "val is now {} ".format(val)

thread1 = threading.Thread(target=increment, args=())
thread2 = threading.Thread(target=increment, args=())
thread1.start()
#thread1.join()
thread2.start()
#thread2.join() 
Run Code Online (Sandbox Code Playgroud)

如果我使用它会有什么不同

thread1.join()
thread2.join()
Run Code Online (Sandbox Code Playgroud)

我在上面的代码中评论了哪些?我运行了两个源代码(一个带注释,另一个没有注释),但输出相同.

Eri*_*lun 65

调用thread1.join()阻止您正在进行调用的线程,直到thread1完成.就像wait_until_finished(thread1).

例如:

import time

def printer():
    for _ in range(3):
        time.sleep(1.0)
        print "hello"

thread = Thread(target=printer)
thread.start()
thread.join()
print "goodbye"
Run Code Online (Sandbox Code Playgroud)

版画

hello
hello
hello
goodbye
Run Code Online (Sandbox Code Playgroud)

- 没有.join()电话,goodbye先来,然后是3*hello.

另外,请注意Python中的线程不提供任何额外的性能(就CPU处理能力而言),因为称为全局解释器锁定,因此它们对于产生可能阻塞(例如IO,网络)和耗时很有用任务(例如数字运算)保持主线程可用于其他任务,它们不允许您利用多个核心或CPU; 为此,看看multiprocessing哪个使用子进程但暴露了一个等价的API threading.

PLUG: ...也是出于上述原因,如果你对并发感兴趣,你可能还想看一个名为Gevent的精美库,这实际上只是让线程更容易使用,更快(当你有许多并发活动)并且不太容易出现与并发相关的错误,同时允许你以与"真实"线程相同的方式保持编码.Twisted,Eventlet,Tornado和许多其他产品要么具有同等性,要么具有可比性.此外,无论如何,我强烈建议阅读这些经典:

  • +1.更好理解的其他示例 (11认同)

小智 5

我修改了代码,以便您了解 join 的工作原理。因此,运行带有注释和不带注释的代码并观察两者的输出。

val = 0

def increment(msg,sleep_time):
   global val 
   print "Inside increment"
   for x in range(10):
       val += 1
       print "%s : %d\n" % (msg,val)
       time.sleep(sleep_time)

thread1 = threading.Thread(target=increment, args=("thread_01",0.5))
thread2 = threading.Thread(target=increment, args=("thread_02",1))
thread1.start()
#thread1.join()
thread2.start()
#thread2.join()
Run Code Online (Sandbox Code Playgroud)