2017-02-07 5 views
0

Я застенчив, чтобы узнать, как поведение with with os.fork каким-то образом определено в спецификации python и как я должен использовать с os.fork.Использование python с with os.fork

Если я, к примеру:

import tempfile 
import os 
with tempfile.TemporaryDirectory() as dir: 
    pid = os.fork() 
    print(pid) 
    print(dir) 

Тогда, кажется, использует наивное поведение удаления TemporaryDirectory дважды:

> python3 foo.py 
27023 
/tmp/tmpg1typbde 
0 
/tmp/tmpg1typbde 
Traceback (most recent call last): 
    File "foo.py", line 6, in <module> 
    print(dir) 
    File "/usr/lib/python3.4/tempfile.py", line 824, in __exit__ 
    self.cleanup() 
    File "/usr/lib/python3.4/tempfile.py", line 828, in cleanup 
    _rmtree(self.name) 
    File "/usr/lib/python3.4/shutil.py", line 467, in rmtree 
    onerror(os.rmdir, path, sys.exc_info()) 
    File "/usr/lib/python3.4/shutil.py", line 465, in rmtree 
    os.rmdir(path) 
FileNotFoundError: [Errno 2] No such file or directory: '/tmp/tmpg1typbde' 

Я интересно:

  1. Если поведение действительно определено
  2. Как лучше всего использовать являются временным справочником между двумя процессами
+1

Возможно, вы можете использовать '' os._exit() '' в дочернем процессе для завершения без какой-либо очистки. Это предполагает, что все, что нужно очистить, разделяется с родительским процессом. – jasonharper

+0

Не настоящий ответ, но действительно ли нужно идти на этот уровень? Обычно существуют более специализированные механизмы для управления несколькими процессами в python для конкретной работы, например. многопроцессорная. – languitar

+0

@ languitar Я не уверен. Код, над которым я сейчас работаю, находится в моем тестовом костюме. Цель кода - порождать многие версии моей программы, чтобы попытаться проверить, есть ли какие-либо гонки в коде блокировки при запуске программы. Поэтому я действительно хочу, чтобы вещи происходили одновременно;). Но вы, вероятно, правы в общем, что os.fork - это не самое лучшее, что можно сделать в python ... – timthelion

ответ

0

Не использовать с этим и делать это грязным старым способом.

> cat foo.py 
import tempfile 
import os 
import shutil 
temp_dir = tempfile.mkdtemp(prefix="foo") 
pid = os.fork() 
print(pid) 
print(temp_dir) 
if not pid: 
    input("pid: %s\nPress enter to continue."%pid) 
if pid: 
    print("pid: %s\nWaiting for other pid to exit."%pid) 
    os.waitpid(pid,0) 
    shutil.rmtree(temp_dir) 
    print("Bye") 

.

> python3 foo.py 
27510 
/tmp/foopyvuuwjw 
pid: 27510 
Waiting for other pid to exit. 
0 
/tmp/foopyvuuwjw 
pid: 0 
Press enter to continue. 
Bye