2009-06-04 25 views
11

Pencerelerde çoklu işlemeyi kullanarak, açık dosya tanıtıcılarının doğuştan gelen işlemlerle miras kaldığını görünür. Bu, onları kilitlemenin hoş olmayan yan etkisine sahiptir.Çok işlemcili dosyada dosya tanıtıcısını devralma önleme lib

ilgilendiğim ya: pencerelerde miras
2)

OSX'te çalışıyor şu kodu göz önünde bulundurun kökenli süreçten dosyayı serbest bırakmak için bir yol, ancak çökme önleme
1) os.rename de

from multiprocessing import Process 
import os 

kFileA = "a.txt" 
kFileB = "b.txt" 

def emptyProcess(): 
    while 1: 
     pass 

def main(): 
    # Open a file and write a message 
    testFile = open(kFileA, 'a') 
    testFile.write("Message One\n") 

    # Spawn a process 
    p = Process(target=emptyProcess) 
    p.start() 

    # Close the file 
    testFile.close() 

    # This will crash 
    # WindowsError: [Error 32] The process cannot access the file 
    #    because it is being used by another process 
    os.rename(kFileA, kFileB) 

    testFile = open(kFileA, 'a') 
    testFile.write("Message Two\n") 
    testFile.close() 

    p.terminate() 


if __name__ == "__main__": 
    main() 

cevap

0

bir dosya tanıtıcısı açtıktan sonra, HANDLE_FLAG_INHERIT bayrağını kaldırmak SetHandleInformation() işlevini kullanabilirsiniz.

+0

Dosya tanıtıcısı open(), os.open() ile oluşturulan bir şeyden nasıl elde edilir? – 14256424

1

Ben çoklu işlem modülü hakkında bilmiyorum, ama subprocess modülü ile herhangi dosya tanımlayıcı devralamaz bunu talimat verebilirsiniz:

If close_fds is true, all file descriptors except 0, 1 and 2 will be closed before the child process is executed. (Unix only). Or, on Windows, if close_fds is true then no handles will be inherited by the child process. Note that on Windows, you cannot set close_fds to true and also redirect the standard handles by setting stdin, stdout or stderr.

Alternatif çocuğunuzun sürecinde tüm dosya tanımlayıcıları yakın olabilir os.closerange

Close all file descriptors from fd_low (inclusive) to fd_high (exclusive), ignoring errors. Availability: Unix, Windows.

+2

Alt işlem bayrağının farkındayım, ancak özellikle çok işlemcili modül hakkında soru soruyorum. Ek olarak, eğer başka bir boru veya dosyamız varsa, close_fds bayrağını devralmak istiyoruz. – 14256424

+0

@vilalian Devralınan dosya tanıtıcılarını tutmak istediğinizde, bu bilgileri alt dosyaya aktarmanız gerekir, böylece hangi dosya tanıtıcılarının kapanmaması gerektiğini bilir. Başka yol yok. – lothar

4

ile fileno() yöntem çalışma zamanı kitaplığı tarafından atanan dosya numarası verir. Dosya numarası verildiğinde, Win32 dosya tanıtıcısını almak için msvcrt.get_osfhandle()'u arayabilirsiniz. Çağrıdaki bu tanıtıcıyı SetHandleInformation'a kullanın.

win32api.SetHandleInformation(
    msvcrt.get_osfhandle(testFile.fileno()), 
    win32api.HANDLE_FLAG_INHERIT, 
    0) 

Ben win32api Modülün tam kullanımının belirli değilim, ama bu bir Python dosya nesnesi ve bir Win32 sapı arasındaki uçurumu yardımcı olacaktır: Yani aşağıdaki gibi bir şey çalışabilir.

0

Dönen günlük ve çoklu işlem kullanırken bu sorunla karşılaştım. Üst süreç günlüğünü döndürmek çalıştığında, diğer bazı yanıtlar dayalı bir

WindowsError: [Error 32] The process cannot access the file because it is being used by another process

başarısız olur, aşağıdaki devralınan gelen günlük dosyası işleyicileri önlemek için piton 2.7 bir çalışma çözümdür

fd = logging.getLogger().handlers[0].stream.fileno() # The log handler file descriptor 
fh = msvcrt.get_osfhandle(fd) # The actual windows handler 
win32api.SetHandleInformation(fh, win32con.HANDLE_FLAG_INHERIT, 0) # Disable inheritance 

Bu sorunun python 3.4'te bir adresi olduğunu unutmayınız. Daha fazla bilgi için bkz. https://www.python.org/dev/peps/pep-0446/

İlgili konular