因为要在原有的函数基础上增加线程进行更改,以减少I/O操作消耗的时间,而创建线程后想要使用就需要将相关部分包装成为一个函数模块,然后在主函数(原函数)里进行调用。
由于调用的包装的函数内部需要几个能够不断调用并且保存值的变量,同时这个线程又是不断在for循环内部进行的。
thread = threading.Thread(target=sava_img,args=(im0,compare_thresh,total_frame,vid_path))
thread.start()
那么如何实现让变量能够随着函数的调用进行改变,并且保存下来能够再次使用呢?
首先我们要确定的是,在主函数调用的函数有哪些变量是需要主函数里的变量作为参数的传递的,其次确定有哪些变量是需要作为全局变量使用的,这些变量在下一次调用函数的时候可以直接。不过需要注意的是,我们定义的函数是在哪里需要使用哪里就定义为全局变量。
将全局变量的默认值写在所有函数之前不然可能会报错,
def sava_img(im0,compare_thresh,total_frame,vid_path):
global selfold_im0
global frame_cnt
global vid_writer
通过全局变量的控制可以实现在主函数里直接调用其他函数并且保存覆盖的值。
在线程传递值的过程中需要注意的是传递的值要和相应的参数对应起来,并且记住主函数传递给调用函数的值即使在调用函数里改变却不会改变主函数原变量的值,这是由于Python特有的传对象方式导致的。在python中所有的变量都可以看做是一个对象,当变量对象传递给参数时会在函数的内部生成一个新的属于这个函数的对象,即使这个对象的值改变了也不会改变原有对象的值,这一点需要注意。
总结如下:
1、在一个函数里同一个变量调用其他函数时作为参数传入时即使在被调用的函数改变了值但是并未改变主函数的这个传入的变量的值。
2、如果被调用函数被反复调用,并且要根据函数内部的数据进行相关计算,那么就需要设置全局变量协助运行,不然无法保存计算的数据。