我们正在尝试从我们的 macPro 运行多线程脚本,但一直收到错误消息。
xml 脚本包含运行特定工具的参数、原始数据的路径和其他运行参数。
我们使用脚本和计算机本地保存的原始数据文件测试了完全相同的命令,并且脚本运行没有问题,因此我们知道脚本和工具都应该可以正常工作。
当我们将原始数据放在 smb 安装的文件夹中时(我们想测试它以节省本地计算机上的存储空间以及节省复制时间),我们收到一条错误消息,提示该进程无法访问该文件,因为它正在被其他进程使用
% dotnet net7/MaxQuant/bin/MaxQuantCmd.dll orbitrapDDA/mqpar.mac.xml
Configuring
Assemble run info
Unhandled exception. System.Exception: Exception during execution of external process: 729 Unhandled exception. System.IO.IOException: The process cannot access the file '/Volumes/pool-cox-testing/MaxQuant_testing_Mac/orbitrapDDA/mqpar.mac.xml' because it is being used by another process.
at Microsoft.Win32.SafeHandles.SafeFileHandle.Init(String path, FileMode mode, FileAccess access, FileShare share, FileOptions options, Int64 preallocationSize, Int64& fileLength, UnixFileMode& filePermissions)
at Microsoft.Win32.SafeHandles.SafeFileHandle.Open(String fullPath, FileMode mode, FileAccess access, FileShare share, FileOptions options, Int64 preallocationSize, UnixFileMode openPermissions, Int64& fileLength, UnixFileMode& filePermissions, Func`4 createOpenException)
at System.IO.Strategies.OSFileStreamStrategy..ctor(String path, FileMode mode, FileAccess access, FileShare share, FileOptions options, Int64 preallocationSize, Nullable`1 unixCreateMode)
at System.IO.StreamReader.ValidateArgsAndOpenPath(String path, Encoding encoding, Int32 bufferSize)
at System.IO.StreamReader..ctor(String path)
at MaxQuantLibS.Domains.Peptides.Basic.MaxQuantParams.ReadVersion(String filePath) in C:\Repositories\net7\net\MaxQuantLibS\Domains\Peptides\Basic\MaxQuantParams.cs:line 661
at MaxQuantLibS.Domains.Peptides.Basic.MaxQuantParams..ctor(String filePath) in C:\Repositories\net7\net\MaxQuantLibS\Domains\Peptides\Basic\MaxQuantParams.cs:line 655
at MaxQuantLibS.Domains.Peptides.Basic.MaxQuantParams.Read(String filename) in C:\Repositories\net7\net\MaxQuantLibS\Domains\Peptides\Basic\MaxQuantParams.cs:line 575
at MaxQuantLibS.Domains.Peptides.Features.RunInfo.AssembleRunInfo(String mqparFile, Int32 fileIndex) in C:\Repositories\net7\net\MaxQuantLibS\Domains\Peptides\Features\RunInfo.cs:line 30
at MaxQuantLibS.Domains.Peptides.Work.AssembleRunInfo.Calculation(String[] args, Responder responder) in C:\Repositories\net7\net\MaxQuantLibS\Domains\Peptides\Work\AssembleRunInfo.cs:line 17
at MaxQuantLibS.Domains.Peptides.Work.MaxQuantWorkDispatcherUtil.PerformTask(Int32 taskType, String[] args, Responder responder) in C:\Repositories\net7\net\MaxQuantLibS\Domains\Peptides\Work\MaxQuantWorkDispatcherUtil.cs:line 9
at MaxQuantLibS.Base.MaxQuantUtils.Run(Int32 softwareId, Int32 taskType, String[] args, Responder responder) in C:\Repositories\net7\net\MaxQuantLibS\Base\MaxQuantUtils.cs:line 377
at MaxQuantTask.Program.Function(String[] args, Responder responder) in C:\Repositories\net7\net\MaxQuantTask\Program.cs:line 18
at Utils.Util.ExternalProcess.Run(String[] args, Boolean debug) in C:\Repositories\net7\net\Utils\Util\ExternalProcess.cs:line 11
at MaxQuantTask.Program.Main(String[] args) in C:\Repositories\net7\net\MaxQuantTask\Program.cs:line 12
at QueueingSystem.WorkDispatcher.ProcessSingleRunExternalProcess(Int32 taskIndex, Int32 threadIndex)
at QueueingSystem.WorkDispatcher.DoWork(Int32 taskIndex, Int32 threadIndex)
at QueueingSystem.WorkDispatcher.Work(Object threadIndex)
at System.Threading.Thread.StartCallback()
zsh: abort dotnet net7/MaxQuant/bin/MaxQuantCmd.dll orbitrapDDA/mqpar.mac.xml
我们假设,这可能与 smb 安装有关,但我们无法确定问题所在或如何解决它。
答案1
好吧,多线程确实“很难”,这主要是因为以下问题:并发“。
文件容易受到并发问题的影响,因此每个操作系统都会实现某种形式的锁定,以确保希望写入文件的线程可以这样做,而不会出现他们的更改被另一个已经打开文件的线程撤消的风险,并且每个读取数据的线程都可以确保他们始终拥有文件的最新版本。
因此,您不能让多个线程同时打开一个文件。