python-thread
모든 스레드에는 그 자신의 CPU 레지스터가 있는데, 스레드의 상하문이라고 하는데, 이 상하문은 스레드가 지난번에 이 스레드를 실행한 CPU 레지스터의 상태를 반영한다.명령 포인터와 창고 포인터 레지스터는 라인 상하문에서 가장 중요한 두 개의 레지스터입니다. 라인은 항상 프로세스가 상하문에서 실행됩니다. 이 주소들은 라인이 있는 프로세스 주소 공간의 메모리를 표시하는 데 사용됩니다.
Python의 표준 라이브러리는 두 개의 모듈을 제공합니다:thread와 threading,thread는 저급 모듈,threading은 고급 모듈,맞아thread가 봉인되었습니다.절대 다수의 상황에서 우리는threading이라는 고급 모듈만 사용할 수 있다.모든 프로세스가 기본적으로 하나의 라인을 시작하기 때문에, 우리는 이 라인을 주 라인이라고 부르고, 주 라인은 새로운 라인을 시작할 수 있습니다. Python의threading 모듈에currentthread () 함수, 현재 라인의 실례를 영원히 되돌려줍니다.주 루틴 실례의 이름은MainThread입니다. 하위 루틴의 이름은 만들 때 지정됩니다. 이름이 없으면 자동으로 루틴에Thread-1,Thread-2,threading은 루틴과 관련된 작업을 제공하는 데 사용됩니다. 루틴은 응용 프로그램에서 작업하는 가장 작은 단원입니다.python 현재 버전의 다중 루틴 라이브러리는 우선순위, 루틴 그룹을 실현하지 못했고, 루틴도 정지, 정지, 복구, 중단될 수 없습니다.threading 모듈에서 제공하는 클래스: Thread, Lock, Rlock, Condition, [Bounded] Semaphore, Event, Timer, local.threading 모듈에서 제공하는 상수:threading.TIMEOUT_MAX는 threading 글로벌 제한 시간을 설정합니다.
import threading
import time
def action(n):
time.sleep(1)
print(' :{0}'.format(threading.current_thread()))
print('i am action',n)
print('my name is ',n)
for i in range(10):
t=threading.Thread(target=action,args=(i,))
t.start()
if __name__=='__main__':
print(threading.current_thread())
print('main thread end')
(2) 클래스로 라인 대상을 포장class MyThread(threading.Thread):
def __init__(self,arg):
super(MyThread,self).__init__() # : 。
self.arg=arg
def run(self): #
time.sleep(1)
print('the arg is:%s\r' % self.arg)
for i in range(4):
t=MyThread(i)
t.start()
if __name__=='__main__':
for i in range(4):
t=MyThread(i)
t.setDaemon(True)
t.start()
print('main thread end')
if __name__ == '__main__':
for i in range(4):
t = MyThread(i)
t.start()
t.join()
이를 통해 알 수 있듯이 프로그램은 순서대로만 실행할 수 있고 모든 라인이 이전 라인의join에 의해 막혀서'다라인'은 다라인의 의미를 잃었다.올바른 방법
if __name__ == '__main__':
th=[]
for i in range(4):
t = MyThread(i)
th.append(t)
t.start()
for tt in th:
tt.join()
# join , ,
print('main thread end!')
import threading
import time
count=0
lock=threading.RLock()
def action(arg):
lock.acquire()
time.sleep(1)
global count
count+=1
print(threading.current_thread())
count-=1
print('the arg is:{0}.count is:{1}'.format(arg,count))
lock.release()
ths=[]
for i in range(4):
t=threading.Thread(target=action,args=(i,))
ths.append(t)
for tt in ths:
tt.start()
for tt in ths:
tt.join()
if __name__=='__main__':
print('main thread end')
#Lock
lock.acquire()
lock.acquire() # 。
#Rlock
rLock.acquire()
rLock.acquire() # , 。
Lock이 가지고 있는 잠금 탱크를 제외하고 Condition에는 대기 탱크가 포함되어 있으며, 탱크의 루트는 다른 루트가 notify ()/notify All () 알림을 호출할 때까지 대기 막힌 상태라고 볼 수 있습니다.알림을 받은 후 라인이 잠금탱크에 들어가 잠금을 기다립니다.구성 방법: Condition([lock/rlock]) 인스턴스 방법:
import threading
import time
product=None
con=threading.Condition()
#
def product():
global product
if con.acquire():
while True:
if not product:
print('product...')
product='anything'
# ,
con.notify()
#
con.wait()
time.sleep(2)
#
def consume():
global product
if con.acquire():
while True:
if product:
print('consume...')
product=None
# ,
con.notify()
#
con.wait()
time.sleep(2)
t1=threading.Thread(target=product)
t2=threading.Thread(target=consume)
t2.start()
t1.start()
생산자 소비자 모델import threading
import time
condition=threading.Condition()
products=0
class Producer(threading.Thread):
def run(self):
global products
while True:
if condition.acquire():
if products<10:
products+=1
print("Producer(%s):deliver one,now products:%s"%(self.name,products))
condition.notify()
condition.release()
else:
print("Producer(%s):already 10, stop deliver, now products:%s" % (self.name, products))
condition.wait()
time.sleep(2)
class Consumer(threading.Thread):
def run(self):
global products
while True:
if condition.acquire():
if products>1:
products-=1
print("Consumer(%s):consume one, now products:%s" % (self.name, products))
condition.notify()
condition.release()
else:
print("Consumer(%s):only 1, stop consume, products:%s" % (self.name, products))
condition.wait()
time.sleep(2)
if __name__=="__main__":
for p in range(0,2):
p=Producer()
p.start()
for c in range(0,3):
c=Consumer()
c.start()
condition.notifyAll() import threading
alist=None
condition=threading.Condition()
def doGreate(): #
global alist
if condition.acquire():
if not alist:
alist=[0 for i in range(10)]
condition.notifyAll()
condition.release()
def doPrint(): #
if condition.acquire():
while not alist:
condition.wait()
for i in alist:
print(i)
print()
condition.notify()
condition.release()
def doSet(): #
if condition.acquire():
while not alist:
condition.wait()
for i in range(len(alist))[::-1]:
alist[i]=1
print(alist[i])
condition.notify()
condition.release()
tcreate=threading.Thread(target=doGreate,name='tcreate')
tprint=threading.Thread(target=doPrint,name='tprint')
tset=threading.Thread(target=doSet,name='tset')
tcreate.start()
tprint.start()
tset.start()
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
파이썬을 사용하여 10진수를 bin, 8진수 및 16진수 형식으로 변환하는 방법은 무엇입니까?텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.