python如何在多线程中管理变量

python如何在多线程中管理变量,python,multithreading,python-multithreading,Python,Multithreading,Python Multithreading,早上好/晚上好,亲爱的社区 我目前正在为大量模拟设置一个分析例程。我希望通过将其转换为多线程例程来提高其速度,其中每个线程获取一个命名文件并应用于我的分析例程。我在HPC服务器上工作,允许我要求一定数量的内核,因此在最后,我将有1个内核在1个文件上与X个内核并行工作 我读了一些关于多线程的例子,我很清楚线程之间共享变量的问题。我的问题是每个线程如何处理自己的“线程变量”?如果我在thread函数中定义了一个变量,它会与其他线程共享吗?我是否必须使用锁定条件才能工作(如果是这样,线程将不会有用,因

早上好/晚上好,亲爱的社区

我目前正在为大量模拟设置一个分析例程。我希望通过将其转换为多线程例程来提高其速度,其中每个线程获取一个命名文件并应用于我的分析例程。我在HPC服务器上工作,允许我要求一定数量的内核,因此在最后,我将有1个内核在1个文件上与X个内核并行工作

我读了一些关于多线程的例子,我很清楚线程之间共享变量的问题。我的问题是每个线程如何处理自己的“线程变量”?如果我在thread函数中定义了一个变量,它会与其他线程共享吗?我是否必须使用锁定条件才能工作(如果是这样,线程将不会有用,因为每个线程都需要等待,直到我相信的所有其他线程完成)

下面是我的分析例程线程的尝试。没有线程的分析正在运行,每个“import glob_**”模块都在运行,我在这里进行了编码和导入

主要的任务函数是线程启动程序:我有X个内核,创建X个线程,然后将每个线程分配给相应的任务,直到处理完所有文件(存储在“文件”列表中)。分析的长度正好是这个列表的长度

thread_task函数是我试图转换的分析例程:获取存储在列表中的文件名(files_to_analysis)并调用我在全局函数中编码和转换的块模块。在这个函数中,我创建的变量将存储正在处理的模拟的信息,因此,如果这些变量存在一些错误,将导致分析错误(例如文件变量或目录)

我这里的问题是:我在thread_任务函数中定义的变量是否会与其他线程共享,从而需要调用threading.Lock()函数?或者我可以解除锁定条件吗

将numpy导入为np
将数学导入为mm
导入glob
导入系统
导入操作系统
进口舒蒂尔
导入线程
将matplotlib导入为mpl
mpl.use('Agg')
将matplotlib.pyplot作为plt导入
从mpl_toolkits.mplot3d导入Axes3D
从numpy导入genfromtxt
从io导入StringIO,字节io
导入glob_general_函数作为gf
导入全局打印计数为scg
将全局文件解释导入为figl
作为bgg导入全球债券gr
导入全局键长度为blg
导入全局探测跟随作为prf
def主任务(nb_岩心、长度分析):
lock=threading.lock()
线程列表=['thread_uu'+str(i)表示范围内的i(nb_核)]
对于范围内的i(0、长度、nb\u芯):
对于范围内的j(铌铀芯):
thread\u list[i]=threading.thread(target=thread\u task,args=(lock,files\u to\u analysis[i+j],)
线程列表[i].start()
线程列表[i].join()
打印(“线程完成!”)
def线程任务(锁定、文件到分析):
"""
线程的任务
调用函数并处理它们
"""
lock.acquire()
file=os.path.split(文件到分析)[1]。替换('.lammps','')
Directory=DirBase+os.path.split(文件到分析)[0]+'/'
临时文件初始化、临时文件1初始化、临时文件2初始化、pos文件初始化、绑定文件初始化、ext文件初始化、ext2文件初始化、Dir文件初始化、nb原子初始化、标头长度初始化、dim x文件初始化、dim y文件初始化、dim z文件初始化、方框大小初始化、读取文件初始化、行文件初始化=FIU.GL(文件、目录)
pos_file_inter,sputt_particles,ext2_inter,len_atoms_sputt,figs,csvData_sputt=scg.sputt_count_glob(文件、临时文件、临时文件、临时文件1、临时文件2、位置文件、绑定文件、外部文件、外部文件、外部文件、外部文件、外部文件、直接文件、nb、原子文件、头文件、长度文件、尺寸x、尺寸y、尺寸z、盒尺寸文件、读取文件、行文件、增量、ε)
如果pos_file_inter==0:
通过
其他:
对于范围内的j(len_原子_sputt):
fig_traj=figs[j]
plt.savefig(文件+''+sputt_粒子[j]+ext2_init)
图中位数,图标题,csvData_bond=blg.bond_length_glob(文件,临时文件,bond_file_init,ext_init,ext2_init,Dir_init,nb_atoms_init,header_length_init,dim_x_init,dim_y_init,dim_z_init,box_size_init,read_file_init,line_init,line_init,cut_init,off,delta)
plt.savefig(图表标题)
fig_probe,csvData1_probe,csvData2_probe=prf。probe_follow_glob(文件、临时文件、pos_file_init、ext_init、ext2_init、Dir_init、nb_atoms_init、标头长度_init、dim_x_init、dim_y_init、dim_z_init、方框大小_init、read_file_init、line_file_init、m_文件、m_init)
plt.savefig(pos_file_init+ext2_init)
fig_gr,grr,csvData_gr=bgg.bond_gr_glob(文件、临时文件、bond_文件、ext_init、ext2_init、Dir_init、nb_原子、头文件长度、dim_x_init、dim_y_init、dim_z_init、box_size_init、read_文件、line_文件、n_init、n_bin、截断、delta)
plt.savefig(文件+grr)
lock.release()

欢迎使用StackOverflow。请按照您创建此帐户时建议的帮助文档中的发布指南,然后…在此处应用。特别是,您没有演示具体的编码问题。您向我们提出了两个相关问题,这些问题可以通过运行您的代码直接回答——毕竟,这是最终答案。期望我们阅读您的代码(特别是在所有开销的情况下)并给出准确的答案是不合理的。当您遇到问题时,发布一个。什么是“线程函数?”您是在问
thread\u task()
在您的示例中?这只是您的程序从新的
线程中调用的一个普通函数。什么是“线程变量?”您是否询问
线程任务()中的局部变量
?这些变量与任何其他普通函数的局部变量一样。它们属于函数的特定部分。它们是在函数运行时创建的