在Python中加入线程
与同时运行多个独立程序一样,同时运行多个线程也有类似的特点,但也有一些额外的好处,具体如下:
- 多个线程与进程中的主线程共享相同的数据空间。因此,与进程不同,它们可以轻松共享信息或相互通信。
- 也称为轻量级进程,它们需要更少的内存开销,因此比进程便宜。
多线程定义为同时或同时执行多个线程的能力。因此,一个进程中可以存在多个线程,其中:
- 每个线程的寄存器集和局部变量都存储在堆栈中。
- 全局变量(存储在堆中)和程序代码在所有线程之间共享。
加入线程的方法
在调用join()方法时,调用线程被阻塞,直到线程对象(在其上调用线程)被终止。线程对象可以在以下任何一种情况下终止:
- 要么正常。
- 通过一个处理不当的异常。
- 直到发生可选超时。
因此 join() 方法表示等待线程终止。我们还可以为 join() 方法指定一个超时值。在这种情况下,调用线程可以通过事件对象发送信号来请求线程停止。 join() 方法可以被多次调用。
句法:
object_name.join()
OR
object_name.join(timeout)
where timeout argument is the timeout value.
例子:
Python3
from threading import Thread
from threading import Event
import time
class Connection(Thread):
StopEvent = 0
def __init__(self,args):
Thread.__init__(self)
self.StopEvent = args
# The run method is overridden to define
# the thread body
def run(self):
for i in range(1,10):
if(self.StopEvent.wait(0)):
print ("Asked to stop")
break;
print("The Child Thread sleep count is %d"%(i))
time.sleep(3)
print ("A Child Thread is exiting")
Stop = Event()
Connection = Connection(Stop)
Connection.start()
print("Main thread is starting to wait for 5 seconds")
Connection.join(5)
print("Main thread says : I cant't wait for more than 5 \
seconds for the child thread;\n Will ask child thread to stop")
# ask(signal) the child thread to stop
Stop.set()
# wait for the child thread to stop
Connection.join()
print("Main thread says : Now I do something else to compensate\
the child thread task and exit")
print("Main thread is exiting")
输出:
The Child Thread sleep count is 1
Main thread is starting to wait for 5 seconds
The Child Thread sleep count is 2
Main thread says : I cant’t wait for more than 5 seconds for the child thread;
Will ask child thread to stop
Asked to stop
A Child Thread is exiting
Main thread says : Now I do something else to compensate the child thread task and exit
Main thread is exiting
在Python中使用 join() 加入线程时要记住的要点:
- 当在同一线程上调用 join() 方法和在同一线程上调用 join() 时会发生运行时错误,从而导致死锁情况。
- 如果在尚未启动的线程上调用 join() 方法,则会引发运行时错误。
- 如果 join() 有 timeout 参数,那么它应该是一个浮点数,以秒为单位表示线程操作的时间。
- 如果 join() 方法没有参数,则阻塞直到线程终止操作。
- 由于 join() 返回的值始终为 None,我们应该始终在 join() 之后立即使用 isAlive() 来检查线程是否还活着。