Является Python встроенными ориентированными на многопотоковое исполнение контейнерами?

Возможно, ваш файл 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'>
52
задан tshepang 1 July 2014 в 03:29
поделиться

4 ответа

Вам необходимо реализовать собственную блокировку для всех общих переменных, которые будут изменены в 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 .

46
ответ дан 7 November 2019 в 09:32
поделиться

Модуль очереди реализует мультипроизводителя, мультипотребительские очереди. Особенно полезно в потоковом программировании, когда информацией нужно обменяться безопасно между несколькими потоками. Класс Очереди в этом модуле реализует всю необходимую семантику блокировки.

https://docs.python.org/3/library/queue.html

0
ответ дан 7 November 2019 в 09:32
поделиться

Да, но вы все равно должны быть осторожны

Например:

Если два потока стремятся к 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
10
ответ дан 7 November 2019 в 09:32
поделиться

Они безопасны для потоков, если не отключить GIL в коде C для потока.

5
ответ дан 7 November 2019 в 09:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: