Еще один простой способ перетасовать:
int LengthArray = solutionArray.lenght();
Random r = new Random();
int randomNumber = r.nextInt(LengthArray);
Integer Chosen = solutionArray.getInteger(randomNumber);
Я не думаю, что существует полностью межплатформенный путь. На Unix fcntl модуль сделает это для Вас. Однако на окнах (который я принимаю Вас, путями), необходимо будет использовать win32file модуль.
, К счастью, существует портативная реализация ( portalocker) использование платформы соответствующий метод в поваренной книге Python.
Для использования его откройте файл, и затем звоните:
portalocker.lock(file, flags)
, где флаги являются portalocker. LOCK_EX для эксклюзивного доступа для записи или LOCK_SH для общего, доступа для чтения.
решение должно работать в том же процессе (как в примере выше), а также когда другой процесс открыл файл.
, Если 'другим процессом' Вы имеете в виду 'безотносительно процесса' (т.е. не Ваша программа) в Linux, нет никакого способа выполнить эту надежду только на системные вызовы ( fcntl & друзья). То, что Вы хотите, обязательная блокировка , и Linux, способ получить его немного более включен:
Повторно монтируют раздел, который содержит Ваш файл с опция mand :
# mount -o remount,mand /dev/hdXY
Набор флаг sgid для Вашего файла:
# chmod g-x,g+s yourfile
В Вашем коде Python, получите монопольную блокировку на том файле:
fcntl.flock(fd, fcntl.LOCK_EX)
теперь даже кошка не будет в состоянии считать файл, пока Вы не выпустите блокировку.
Вот запуск на win32 половине портативной реализации, для которой не нужен отдельный механизм блокировки.
Требует Python для Windows Extensions переходить к win32 api, но это уже в значительной степени обязательно для Python на окнах и может альтернативно быть сделано с ctypes. Код мог быть адаптирован для представления большей функциональности, если этому было нужно (такие как разрешение FILE_SHARE_READ
, а не никакое совместное использование вообще). См. также документацию MSDN для CreateFile
и WriteFile
системные вызовы, и статья о Создании и Открытии Files .
, Как был упомянут, можно использовать стандарт модуль fcntl для реализации Unix половина из этого при необходимости.
import winerror, pywintypes, win32file
class LockError(StandardError):
pass
class WriteLockedFile(object):
"""
Using win32 api to achieve something similar to file(path, 'wb')
Could be adapted to handle other modes as well.
"""
def __init__(self, path):
try:
self._handle = win32file.CreateFile(
path,
win32file.GENERIC_WRITE,
0,
None,
win32file.OPEN_ALWAYS,
win32file.FILE_ATTRIBUTE_NORMAL,
None)
except pywintypes.error, e:
if e[0] == winerror.ERROR_SHARING_VIOLATION:
raise LockError(e[2])
raise
def close(self):
self._handle.close()
def write(self, str):
win32file.WriteFile(self._handle, str)
Вот то, как Ваш пример сверху ведет себя:
>>> path = "C:\\scr.txt"
>>> file1 = WriteLockedFile(path)
>>> file2 = WriteLockedFile(path) #doctest: +IGNORE_EXCEPTION_DETAIL
Traceback (most recent call last):
...
LockError: ...
>>> file1.write("111")
>>> file1.close()
>>> print file(path).read()
111
Для создания Вас в безопасности, когда вводные файлы в рамках одного приложения, Вы могли попробовать что-то вроде этого:
import time
class ExclusiveFile(file):
openFiles = {}
fileLocks = []
class FileNotExclusiveException(Exception):
pass
def __init__(self, *args):
sMode = 'r'
sFileName = args[0]
try:
sMode = args[1]
except:
pass
while sFileName in ExclusiveFile.fileLocks:
time.sleep(1)
ExclusiveFile.fileLocks.append(sFileName)
if not sFileName in ExclusiveFile.openFiles.keys() or (ExclusiveFile.openFiles[sFileName] == 'r' and sMode == 'r'):
ExclusiveFile.openFiles[sFileName] = sMode
try:
file.__init__(self, sFileName, sMode)
finally:
ExclusiveFile.fileLocks.remove(sFileName)
else:
ExclusiveFile.fileLocks.remove(sFileName)
raise self.FileNotExclusiveException(sFileName)
def close(self):
del ExclusiveFile.openFiles[self.name]
file.close(self)
Тот путь Вы разделяете на подклассы file
класс. Теперь просто сделайте:
>>> f = ExclusiveFile('/tmp/a.txt', 'r')
>>> f
<open file '/tmp/a.txt', mode 'r' at 0xb7d7cc8c>
>>> f1 = ExclusiveFile('/tmp/a.txt', 'r')
>>> f1
<open file '/tmp/a.txt', mode 'r' at 0xb7d7c814>
>>> f2 = ExclusiveFile('/tmp/a.txt', 'w') # can't open it for writing now
exclfile.FileNotExclusiveException: /tmp/a.txt
при открытии его сначала с 'w' режимом это не позволит, больше открывается, даже в режиме чтения, как Вы хотели...