Вызов ограниченного потока семафора из функции приводит к `NameError: имя 'sema' не определено` - PullRequest
1 голос
/ 24 июня 2019

Если я хочу ограничить количество создаваемых потоков, я использую семафор, как в примере ниже

def TestFunction( m, n ):
    sema.acquire()
    print(m+n)
    sema.release()

maxthreads = 2
sema = threading.Semaphore(value=maxthreads)
j=6

for i in range(0, 2*2): #totalNumberOfRows
    thread = threading.Thread(target=TestFunction,args=( i , j ))
    thread.start()

Однако, если я вызываю потоки из функции, я сталкиваюсь с ошибкой NameError: name 'sema' is not defined.

def TestFunction( m, n ):
    sema.acquire()
    print(m+n)
    sema.release()

def CallThreads(k):

    maxthreads = 2
    sema = threading.Semaphore(value=maxthreads)
    j=6

    for i in range(0, k*2): #totalNumberOfRows
        thread = threading.Thread(target=TestFunction,args=( i , j ))
        thread.start()

for mstr in range(0, 10): 
    CallThreads(mstr)

В этом случае я должен определить sema вне обеих функций? Если это так, сможет ли thread, созданный в CallThreads, распознать этот sema и использовать его внутри TestFunction?

Возможное решение:

def TestFunction( m, n ):
    sema.acquire()
    print(m+n)
    sema.release()

def CallThreads(k):

    maxthreads = 2
    j=6

    for i in range(0, k*2): #totalNumberOfRows
        thread = threading.Thread(target=TestFunction,args=( i , j ))
        thread.start()

for mstr in range(0, 10): 
    sema = threading.Semaphore(value=maxthreads)
    CallThreads(mstr)
...