Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于运行可执行文件的python多线程进程_Python_Multithreading_Executable - Fatal编程技术网

用于运行可执行文件的python多线程进程

用于运行可执行文件的python多线程进程,python,multithreading,executable,Python,Multithreading,Executable,我正在尝试将一个在windows上运行可执行文件并管理文本输出文件的python脚本升级到一个使用多线程进程的版本,以便可以使用多个核心。我有四个独立版本的可执行文件,每个线程都知道如何访问。这部分很好用。我遇到的问题是,它们同时运行,并尝试打开(不同的)输出文件,以确保它们正确运行,并根据输出文件的内容做出反应 具体来说,当运行三个线程时,两个线程将崩溃并出现以下错误,而一个线程将继续工作: Exception in thread Thread-4: Traceback (most recen

我正在尝试将一个在windows上运行可执行文件并管理文本输出文件的python脚本升级到一个使用多线程进程的版本,以便可以使用多个核心。我有四个独立版本的可执行文件,每个线程都知道如何访问。这部分很好用。我遇到的问题是,它们同时运行,并尝试打开(不同的)输出文件,以确保它们正确运行,并根据输出文件的内容做出反应

具体来说,当运行三个线程时,两个线程将崩溃并出现以下错误,而一个线程将继续工作:

Exception in thread Thread-4:
Traceback (most recent call last):
  File "C:\Python27\lib\threading.py", line 552, in __bootstrap_inner
    self.run()
  File "E:\HDA\HDA-1.0.1\Hm-1.0.1.py", line 782, in run
    conf = self.conf_file(Run)
  File "E:\HDA\HDA-1.0.1\Hm-1.0.1.py", line 729, in conf_file
    l = open(self.run_dir(Run)+Run, 'r').readlines()     #list of file lines
IOError: [Errno 2] No such file or directory: 'Path/to/Outputfile'

这是因为线程没有正确运行可执行文件(即为什么没有创建“Path/to/Outputfile”,因此找不到它)。但是其中一个线程可以正确执行此操作,而其他两个线程则不能。有什么原因使我不能让多个线程运行不同版本的可执行文件吗?

Python目前无法利用多个内核,原因是。多线程往往充满了麻烦,无论如何,如果可以的话,最好使用多个进程。

Python目前无法利用多个内核,因为它的。多线程往往充满麻烦,无论如何,如果可以的话,最好使用多个进程。

我不认为GIL本身不会自行解决这个问题,除非打开一个文件会让你陷入某种奇怪的死锁或自旋锁状态通常,在这样的情况下,如果您是I/O绑定的,您需要线程。事实上,线程能够并发运行这一事实可能导致其他线程失败,而不是多次成功打开文件

作者指出,GIL发布了阻塞I/O调用的命令,以给其他线程一个机会

这里真正的问题似乎是对文件资源的锁定。我不太清楚Windows是如何工作的,所以我无法解释为什么会出现这种错误,但似乎只有一个线程实际锁定了一个文件资源

另一张海报上关于多核和GIL的观点可能正在发挥作用,因为在其他两个线程耗尽的情况下,可能会发生某种优先级反转,但我发现,上述演示不太可能说,在阻塞操作中间的线程释放了其他线程的锁。

一个想法是尝试。我想您在跨多个进程而不是线程读取文件时会更幸运

下面是我在OS 10.7.3机器上编写和尝试的一个示例,它打开了一个文件
test
,其内容是
lol\n

import multiprocessing
import os

def open_file(x):
   with open(x, 'r') as file_obj:
     return file_obj.readlines()

a = multiprocessing.Pool(4)
print a.map(open_file, ['test']*4)
下面是我执行它时的结果:

➜  ~ git:(master) ✗ python open_test.py
[['lol\n'], ['lol\n'], ['lol\n'], ['lol\n']]

我不认为GIL本身不会杀死它,除非打开一个文件让你陷入某种奇怪的死锁或自旋锁状态通常,在这样的情况下,如果您是I/O绑定的,您需要线程。事实上,线程能够并发运行这一事实可能导致其他线程失败,而不是多次成功打开文件

作者指出,GIL发布了阻塞I/O调用的命令,以给其他线程一个机会

这里真正的问题似乎是对文件资源的锁定。我不太清楚Windows是如何工作的,所以我无法解释为什么会出现这种错误,但似乎只有一个线程实际锁定了一个文件资源

另一张海报上关于多核和GIL的观点可能正在发挥作用,因为在其他两个线程耗尽的情况下,可能会发生某种优先级反转,但我发现,上述演示不太可能说,在阻塞操作中间的线程释放了其他线程的锁。

一个想法是尝试。我想您在跨多个进程而不是线程读取文件时会更幸运

下面是我在OS 10.7.3机器上编写和尝试的一个示例,它打开了一个文件
test
,其内容是
lol\n

import multiprocessing
import os

def open_file(x):
   with open(x, 'r') as file_obj:
     return file_obj.readlines()

a = multiprocessing.Pool(4)
print a.map(open_file, ['test']*4)
下面是我执行它时的结果:

➜  ~ git:(master) ✗ python open_test.py
[['lol\n'], ['lol\n'], ['lol\n'], ['lol\n']]

使用线程我会有两个问题,“我知道”,我想一个典型的问题是在某个地方调用os.chdir(),因为当前工作目录是进程范围的属性。使用线程我会有两个问题,“我知道”,我想一个典型的问题是在某个地方调用os.chdir(),因为当前工作目录是进程范围的属性。