Если я хочу ограничить количество создаваемых потоков, я использую семафор, как в примере ниже
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)