Возможно, ваш файл sample.txt
отформатирован примерно так:
70
60
55
75
95
90
80
80
85
100
В этом файле нет ничего, что помнит, что введенное вами значение является целым числом, и поскольку это текстовый документ (.txt
) он также не будет кодировать числа как таковые. Что касается \n
, то каждое число находится на отдельной строке, означая, что должен быть какой-то символ, обозначающий символ новой строки, следовательно, символ \n
символа новой строки.
Если вы посмотрите на эту строку в вашем коде:
f.write('%d \n' %i)
, вы явно пишете \n
после каждого числа. Если вы хотите прочитать числа из текстового файла и сделать их целыми числами, вы должны явно преобразовать строковое значение в его целочисленное представление. Вы можете переписать эту логику в:
>>> with open("sample.txt", "r", encoding="utf-8") as g:
... data = list(map(int, g.readlines()))
...
>>> data
[70, 60, 55, 75, 95, 90, 80, 80, 85, 100]
, где он отобразит тип int
на каждое значение списка, возвращаемого g.readlines()
, а затем снова преобразует объект map
в list
, И, если вам интересно, int
игнорирует пробелы (пробелы и новые строки), как у вас в каждой строке.
>>> int("70 \n")
70
>>> type(int("60 \n"))
<class 'int'>
Вам необходимо реализовать собственную блокировку для всех общих переменных, которые будут изменены в Python. Вам не нужно беспокоиться о чтении из переменных, которые не будут изменены (т. Е. Одновременные чтения допустимы), поэтому неизменяемые типы ( frozenset
, tuple
, str
) вероятно безопасны, но это не повредит. Для вещей, которые вы собираетесь изменить - list
, set
, dict
и большинства других объектов, у вас должен быть свой собственный механизм блокировки (в то время как in- Операции place подходят для большинства из них, потоки могут привести к очень неприятным ошибкам - вы также можете реализовать блокировку, это довольно просто).
Кстати, я не знаю, знаете ли вы это, но в Python блокировка очень проста - создайте объект threading.lock, а затем вы можете получить / освободить его следующим образом:
import threading
list1Lock = threading.Lock()
with list1Lock:
# change or read from the list here
# continue doing other stuff (the lock is released when you leave the with block)
В Python 2.5, сделать из __future__ import with_statement
; Python 2.4 и более ранние версии не имеют этого, поэтому вы захотите поместить вызовы acqu () / release () в try: ... finally:
блоки:
import threading
list1Lock = threading.Lock()
try:
list1Lock.acquire()
# change or read from the list here
finally:
list1Lock.release()
# continue doing other stuff (the lock is released when you leave the with block)
Некоторые очень полезные сведения о синхронизация потоков в Python .
Модуль очереди реализует мультипроизводителя, мультипотребительские очереди. Особенно полезно в потоковом программировании, когда информацией нужно обменяться безопасно между несколькими потоками. Класс Очереди в этом модуле реализует всю необходимую семантику блокировки.
Да, но вы все равно должны быть осторожны
Например:
Если два потока стремятся к pop ()
из списка с одним элементом, Один поток получит элемент успешно, а другой получит IndexError
Код, подобный этому, не является потокобезопасным
if L:
item=L.pop() # L might be empty by the time this line gets executed
Вы должны написать его так
try:
item=L.pop()
except IndexError:
# No items left
Они безопасны для потоков, если не отключить GIL в коде C для потока.