2015-02-15 2 views
1

Я прочитал «Программирование приложений на основе ядра Python», в котором этот код написан.Что такое Lock в Python _thread module?

import _thread 
from time import sleep, ctime 

loops = [4, 2] 

def loop(nloop, nsec, lock): 
    print("start loop", nloop, "at:", ctime()) 
    sleep(nsec) 
    print("loop", nloop, "done at:", ctime()) 
    lock.release() 

def main(): 
    print("starting at:", ctime()) 
    locks = [] 
    nloops = range(len(loops)) 

    for i in nloops: 
    lock = _thread.allocate_lock() 
    a = lock.acquire() 
    locks.append(lock) 

    for i in nloops: 
    _thread.start_new_thread(loop, (i, loops[i], locks[i])) 

    for i in nloops: 
    while locks[i].locked(): pass 

    print("all DONE at:", ctime()) 

if __name__ == "__main__": 
    main() 

В официальном справочнике я видел, что «только один поток за один раз может приобрести замок». Замок должен гарантировать, что выполняется только один поток за раз, не так ли? Теперь у меня есть два вопроса.

  1. Почему может быть изготовлено более одного замка?
  2. Почему две нитки могут захватывать каждый замок одновременно?
+0

Вы должны выделить только ** одну ** блокировку и должны быть получены, выпущены в функции потока. – falsetru

+0

Пожалуйста, задавайте каждый вопрос на свой вопрос, а не вместе. –

+0

«Блокировка должна гарантировать, что за один раз выполняется только один поток, не так ли?» Нет. Блокировка должна гарантировать, что только одному потоку, который приобрел блокировку, разрешено выполнять блок кода, завернутый этой блокировкой. – ozgur

ответ

1

Re (1), вы можете сделать столько блокировок, сколько вам нужно - по-видимому, они необходимы для защиты разных общих изменяемых ресурсов в многопоточной среде (лично я думаю, что среда программирования со многими потоками разделение многих изменяемых ресурсов - это то, где программисты идут после прохождения, если они вели действительно страшные жизни).

Re (2): «Почему две нитки приобретают каждый замок одновременно» - они абсолютно не могут, это все, что касается замков: каждый замок может удерживаться не более чем одним потоком в любое время. Объект блокировки построен таким образом, используя любые базовые ресурсы, которые предоставляет операционная система для этой цели.

+0

Я добавил этот код после приобретения замков. для i в nloops: locks [i] .locked(), и они возвращают True. Зачем ? GIL делает только исполняемый файл за раз, не так ли? – q2ven

+0

@ q2ven yes to gil, но не имеет значения. Все блокировки заблокированы, но это не говорит вам **, что ** нить, которую они держат. –

+0

Вы имеете в виду, что блокировка нитевого и потокового модулей и Global Lock не имеет значения? Я думал, что они такие же. Спасибо и извините мой плохой английский. – q2ven

Смежные вопросы