2016-01-03 2 views
1

Я экспериментирую с многопроцессорностью python. Я боролся с ошибкой в ​​своем коде и сумел сузить ее. Тем не менее, я до сих пор не знаю, почему это происходит. То, что я публикую, - всего лишь образец кода. Если я импортирую модуль tempfile и изменяю tempdir, код падает при создании пула. Я использую Python 2.7.5python tempfile и ошибка многопроцессорного пула

Вот код

from multiprocessing import Pool 
import tempfile 

tempfile.tempdir = "R:/" #REMOVING THIS LINE FIXES THE ERROR 

def f(x): 
return x*x 

if __name__ == '__main__': 
pool = Pool(processes=4)    # start 4 worker processes 
result = pool.apply_async(f, [10]) # evaluate "f(10)" asynchronously 
print result.get(timeout=1)   # prints "100" unless your computer is *very* slow 
print pool.map(f, range(10))   # prints "[0, 1, 4,..., 81]" 

Вот ошибка

R:\>mp_pool_test.py 
Traceback (most recent call last): 
    File "R:\mp_pool_test.py", line 11, in <module> 
pool = Pool(processes=4)    # start 4 worker processes 
File "C:\Python27\lib\multiprocessing\__init__.py", line 232, in Pool 
return Pool(processes, initializer, initargs, maxtasksperchild) 
File "C:\Python27\lib\multiprocessing\pool.py", line 138, in __init__ 
self._setup_queues() 
File "C:\Python27\lib\multiprocessing\pool.py", line 233, in _setup_queues 
self._inqueue = SimpleQueue() 
File "C:\Python27\lib\multiprocessing\queues.py", line 351, in __init__ 
self._reader, self._writer = Pipe(duplex=False) 
File "C:\Python27\lib\multiprocessing\__init__.py", line 107, in Pipe 
return Pipe(duplex) 
File "C:\Python27\lib\multiprocessing\connection.py", line 223, in Pipe 
1, obsize, ibsize, win32.NMPWAIT_WAIT_FOREVER, win32.NULL 
WindowsError: [Error 123] The filename, directory name, or volume label syntax is incorrect 

Этот код работает отлично.

from multiprocessing import Pool 
import tempfile as TF 

TF.tempdir = "R:/" 

def f(x): 
    return x*x 

if __name__ == '__main__': 
print("test") 

Странная вещь в том, что оба раза я ничего с TF.tempdir не делать, но один с Бассейн не работает по какой-то причине.

+0

Почему вы используете временный файл? Почему вы передаете R:/как строку для каталога? – PyNEwbie

+0

Перед установкой 'tempfile.tempdir' напечатайте его, чтобы вы могли видеть пример допустимой записи в Windows. Вероятно, вам понадобится «r» R: \ "'. –

+0

Я так и думал, но следил за его созданием в моем интерпретаторе, и он работал нормально, я все время забываю о том, что окна позволяют использовать/в пути. Если вы перейдете к приглашению cmd и введите cd c: /, то в интерпретаторе он изменится на c: \, если вы используете os.chdir ('E: /'), cwd будет e: \\ по сути если вы используете/в подсказке cmd, вам не нужно указывать путь wihen есть пробелы, он не будет автозаполнен, хотя – PyNEwbie

ответ

0

Это круто выглядит, как у вас есть имя столкновения с того, что я могу видеть в

"C: \ Program Files \ ПИТОН \ Lib \ многопроцессорная \ connection.py"

Кажется, что multipprocessing использует временный файл, а

Такое поведение не должно было случиться, но он смотрит на меня как проблема в строке 66 connection.py

elif family == 'AF_PIPE': 
    return tempfile.mktemp(prefix=r'\\.\pipe\pyc-%d-%d-' % 
          (os.getpid(), _mmap_counter.next())) 

Я все еще ковыряя в этом, я посмотрел на globals после импорта tempfile, а затем tempfile как TF, существуют разные имена, но теперь мне интересно о ссылках, и поэтому я пытаюсь выяснить, указывают ли они на одно и то же.

+0

Я тоже так думал, но не должен импортировать с «import tempfile as TF» исправить эту проблему? Он по-прежнему дает ту же ошибку. – Carl

+0

Это выше моего уровня оплаты, но я думаю, что, несмотря на то, что вы называете его, имя все еще существует в глобальном масштабе, но я не совсем уверен – PyNEwbie

Смежные вопросы