Является ли callFromThread потокобезопасным - PullRequest
1 голос
/ 01 июля 2011

Я посмотрел код для callFromThread. Он добавляет все вызываемые объекты в список threadCallQueue. Если несколько потоков вызывают callFromThread, как callFromThread может быть потокобезопасным? Другими словами, без блокировки threadCallQueue, как callFromThread может быть безопасным для потока? Я что-то упускаю из виду?

1 Ответ

2 голосов
/ 01 июля 2011

Несколько потоков могут добавлять элементы в список (это производители), и это всегда делается с помощью вызова append () (так, в конце списка):

self.threadCallQueue.append((f, args, kw))

Только основной поток когда-либо читает элементы и удаляет их из списка (это потребитель), и он всегда читает в начале списка:

# Keep track of how many calls we actually make, as we're
# making them, in case another call is added to the queue
# while we're in this loop.
count = 0
total = len(self.threadCallQueue)
for (f, a, kw) in self.threadCallQueue:
    try:
        f(*a, **kw)
    except:
        log.err()
    count += 1
    if count == total:
        break
del self.threadCallQueue[:count]

Итак, поскольку один поток читает с начала списка, а другие пишут в конце, это потокобезопасно , пока списки Python . Это отмечено в исходном коде функции:

# lists are thread-safe in CPython, but not in Jython
# this is probably a bug in Jython, but until fixed this code
# won't work in Jython.
...