Nie mogę zdecydować, czy następujący deque jest bezpieczny dla wątków.
W skrócie, utworzyłem klasę z deque, która wyświetla jej zawartość co 1 sekundę w nowym wątku (więc nie wstrzyma programu głównego podczas drukowania).
Deque jest wypełniony z głównego wątku, więc w zasadzie POWINNA być szansa na kolizję.
JEDNAK, deque jest wypełniana przy użyciu metody klasy, więc zasadniczo jest dostępna z poziomu samej instancji, a więc z tego samego wątku.
Oto uproszczony kod:Czy to jest bezpieczne w python?
import threading
import time
from collections import deque
class MyQueue(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.q = deque()
self.start()
def run(self):
# pop out queue items every 1 sec
# (please ignore empty deque for now)
while True:
print self.q.popleft()
time.sleep(1)
def add_to_q(self, val):
# this function is called from outside
self.q.append(val)
# main
# fill the queue with values
qu = MyQueue()
for i in range(1:100):
qu.add_to_q(i)
Tak, chociaż dodawanie i usuwanie elementów z kolejki odbywać wewnątrz instancji, to istnieje ryzyko, ze względu na funkcję dodawania miano spoza instancji?
EDYTOWANIE:
Ponieważ potrzebuję zmodyfikować elementy w mojej deque, musiałem użyć Deque. To, co robię, to: roatować() do danego elementu, wyskakuj, zmodyfikuj, wepchnij z powrotem i obróć() z powrotem do pierwotnej pozycji.
ile znajdę sposób wdrażania elementów modyfikujących w kolejce, muszę trzymać się deque
Jeśli wystarczy kolejki wątku bezpieczny (nie do zobaczenia przy użyciu jakichkolwiek funkcji specyficznych dla paczki), prawdopodobnie powinieneś użyć wbudowanej kolejki wątkowej bezpiecznej (http://docs.python.org/library/queue.html). – delnan
David, dzięki, dodałem pętlę. Delnan, Wykluczyłem niektóre funkcje. Deque jest obracany co jakiś czas, dzięki czemu przedmioty mogą być wyskakiwane, modyfikowane, popychane z powrotem i obracane z powrotem do swojej pierwotnej pozycji. Nie znalazłem sposobu na zrobienie tego z Queue – user1102018
Nie można napisać kodu, aby przetestować, czy coś jest bezpieczne dla wątków, a zamiast tego musisz przeczytać dokumentację lub zapoznać się z kodem źródłowym. Często, jeśli coś nie jest bezpieczne dla wątków, nadal będzie działało prawie cały czas w kontekście wątków, a następnie eksploduje kilka tygodni później. –