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和许多其他产品要么具有同等性,要么具有可比性.此外,无论如何,我强烈建议阅读这些经典:
小智 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)