Python 학습 일기----스레드, 이벤트, 대기열
进程与线程的区别:
线程==指令集,进程==资源集 (线程集)
1、同一个进程中的线程共享内存空间,进程与进程之间是独立的
2、同一个进程中的线程是可以直接通讯交流的,进程与间通讯必需通过一个中间的代理才能实现
3、创建线程简单,创建进程,是克隆父进程
4、一个线程可以控制和操作同一进程里的其他线程,但进程只能操作子进程
5、线程启动速度快,进程启动速度比较慢
线程示例:
1 import time ,threading 2 3 def run(attr): 4 print('输出:',attr) 5 time.sleep(3) 6 7 8 t1=threading.Thread(target=run,args=('第一个线程',)) 9 t2=threading.Thread(target=run,args=('第二个线程',))10 11 t1.start()#启动线程112 t2.start()#启动线程2
1 def run2(attr):2 print('输出:',attr)3 time.sleep(3)4 5 run2('第一个线程')6 run2('第二个线程')7 #以上转为串联执行
继承线程 类写线程
1 #!usr/bin/env python 2 #-*-coding:utf-8-*- 3 # Author calmyan 4 5 import threading,time 6 7 class thre(threading.Thread):#继承线程中的类 8 def __init__(self,n,times): 9 super(thre,self).__init__()10 self.n=n11 self.teims=times12 def run(self):13 print('执行第一线程:',self.n)14 time.sleep(self.teims)15 16 star_time=time.time()17 t1=thre('第一线程',3)18 t2=thre('第二线程',4)19 t1.start()20 t2.start()21 t1.join()#join等待该线程执行完成22 23 t2.join()24 den_time=time.time()-star_time25 print(den_time)
等待线程执行完成,用.join


1 import time ,threading 2 lock=threading.Lock()#定义一个线程锁变量 3 def run(attr): 4 lock.acquire()#申请一个线程锁 5 global num 6 print('输出:',attr) 7 #time.sleep(3) 8 num+=1 9 lock.release()#释放线程锁10 time.sleep(3)11 print('输出完成'.center(10,'〓'))12 star_time=time.time()#开始时间13 14 num=015 re_lilst=[]#定义一个列表16 for i in range(50):17 t1=threading.Thread(target=run,args=(('第%s线程'%i),))#新建线程18 #t1.setDaemon(True)#设置为守护进程 当主线程完成,守护也停止19 t1.start()#起动线程20 re_lilst.append(t1)#不用JOIN,避免阻塞为串行21 22 print(threading.current_thread(),threading.active_count())#查看线程 的主 子 活跃线程23 #print('分线程'.center(40,'☆'))24 print('数字:',num)25 for i in re_lilst:#等待线程 完成26 i.join()27 print('数字:',num)28 print('主线程'.center(60,'◇'),threading.current_thread(),threading.active_count())29 30 den_time=time.time()-star_time#总共时间31 print(den_time)
守护进程,相当于主进程的下属,当主进程结束,无论守护进程内的是否执行完成,都会停止!


1 import time ,threading 2 lock=threading.Lock()#定义一个线程锁变量 3 def run(attr): 4 lock.acquire()#申请一个线程锁 5 global num 6 print('输出:',attr) 7 8 #time.sleep(3) 9 num+=110 lock.release()#释放线程锁11 time.sleep(3)12 print('输出完成'.center(10,'〓'))13 14 star_time=time.time()#开始时间15 16 num=017 re_lilst=[]#定义一个列表18 for i in range(50):19 t1=threading.Thread(target=run,args=(('第%s线程'%i),))#新建线程20 t1.setDaemon(True)#设置为守护进程 当主线程完成,守护也停止21 t1.start()#起动线程22 re_lilst.append(t1)#不用JOIN,避免阻塞为串行23 24 print(threading.current_thread(),threading.active_count())#查看线程 的主 子 活跃线程25 #print('分线程'.center(40,'☆'))26 print('数字:',num)27 # for i in re_lilst:#等待线程 完成28 # i.join()29 print('数字:',num)30 print('主线程'.center(60,'◇'),threading.current_thread(),threading.active_count())31 32 den_time=time.time()-star_time#总共时间33 print(den_time)
线程锁,在py3中可以不使用:
lock=threading.Lock()
lock.acquire()
递归锁 用于递归线程


1 import time ,threading 2 3 def run(i): 4 print('输出:-------',i) 5 lock.acquire()#申请锁 6 global num1 7 num1+=1 8 time.sleep(0.1) 9 lock.release()#释放锁10 return num111 12 def run2(i):13 lock.acquire()#申请锁14 global num215 print('输出:22',i)16 num2+=117 time.sleep(0.1)18 lock.release()#释放锁19 return num220 21 def run3(i):22 lock.acquire()#申请锁23 res=run(i)24 print('输出:333',i)25 res2=run2(i)26 time.sleep(0.1)27 print(res,res2)28 lock.release()#释放锁29 30 31 if __name__ == '__main__':32 star_time=time.time()#开始时间\33 num1,num2=0,034 #lock=threading.Lock()#定义一个线程锁,如是线程锁,递归时会出错35 lock=threading.RLock()#定义一个递归锁36 37 for i in range(10):38 #t1=threading.Thread(target=run,args=(('第%s线程'%i),))#新建线程39 t1=threading.Thread(target=run3,args=(('第%s线程'%i),))#新建线程40 t1.start()#起动线程41 42 else:43 print('活跃线程数:',threading.active_count())#查看线程 活跃线程数44 45 46 while threading.active_count()!=1:#不只一个线程,就是说,判断是否是剩下主线程47 #print(threading.active_count())#查看线程 活跃线程数48 pass49 else:50 print('主线程:pid,活跃线程数'.center(60,'◇'),threading.current_thread(),threading.active_count())#51 den_time=time.time()-star_time#总共时间52 print(den_time)53 print(num1,num2)
信号量 相当与 多个线程锁


1 #!usr/bin/env python 2 #-*-coding:utf-8-*- 3 # Author calmyan 4 5 #!usr/bin/env python 6 #-*-coding:utf-8-*- 7 # Author calmyan 8 import time ,threading 9 10 def run(attr):11 semaphore.acquire()#申请信号量线程锁12 global num13 print('输出:',attr)14 time.sleep(1)15 semaphore.release()#释放信号量线程锁16 17 star_time=time.time()#开始时间18 if __name__ == '__main__':19 20 semaphore=threading.BoundedSemaphore(4)#信号量 最多允许几个线程同时运行(多把锁)21 for i in range(50):22 t1=threading.Thread(target=run,args=(('第%s线程'%i),))#新建线程23 t1.start()#起动线程24 25 while threading.active_count()!=1:#不只一个线程,就是说,判断是否是剩下主线程26 pass27 else:28 print('主线程'.center(60,'◇'),threading.current_thread(),threading.active_count())29 den_time=time.time()-star_time#总共时间30 print(den_time)
Event 线程标志
红绿灯示例


1 #!usr/bin/env python 2 #-*-coding:utf-8-*- 3 # Author calmyan 4 5 import threading,time 6 7 event=threading.Event()#生成一个标示位对象 8 def lighter():# 9 count=0 #定义时间秒数10 event.set()#设置标志位11 while True:12 if count>9 and count<15:#设定为红灯13 event.clear()#清除标志位,14 print('\033[41;1m变为红灯!\033[0m')15 elif count>=15 and count<18 :#为黄灯16 17 print('\033[43;1m变为黄灯!\033[0m')18 elif count>=18:19 event.set()#设置标志位20 print('\033[42;1m变为绿灯!\033[0m')21 count=0#重新计时22 else:23 print('\033[42;1m绿灯中.....!\033[0m')24 time.sleep(1)25 count+=1#每一秒钟加一次26 27 28 def car(name):29 while True:30 if event.is_set():#如果有标志 说明为绿灯31 print('[%s]在行驶中....'%name)32 time.sleep(1)33 else:34 print('[%s]在等待中.....'%name)35 event.wait()#等待获取标志36 print('绿灯亮了,[%s]继续行驶...'%name)37 time.sleep(1)38 39 40 light=threading.Thread(target=lighter,)#定义一个线程41 light.start()#启动线程42 43 car1=threading.Thread(target=car,args=('红旗轿车',))#生成一个汽车线程44 car1.start()
队列 生产者消费者模型


1 #!usr/bin/env python 2 #-*-coding:utf-8-*- 3 # Author calmyan 4 5 #队列 生产者消费者模型 6 7 import threading,time,queue 8 9 q=queue.Queue()#创建一个队列10 11 def produ(name):#生产函数12 count=013 while True:14 bz=name+str(count)15 q.put(bz)16 print('[%s]生产了,第[%s]个[%s]g 包子'%(name,count,bz))17 count+=118 time.sleep(1.5)19 20 def consump(name):#消费者21 while True:22 i=q.get()#取23 print('[%s]拿到包子[%s],并吃了'%(name,i))24 time.sleep(0.5)25 26 27 p1=threading.Thread(target=produ,args=('王五包子铺',))#创建一个新线程 生产者28 p2=threading.Thread(target=produ,args=('麻子六包子铺',))#创建一个新线程 生产者29 r1=threading.Thread(target=consump,args=('张三',))#创建一个新线程 消费者30 r2=threading.Thread(target=consump,args=('李四',))#创建一个新线程 消费者31 p1.start()32 p2.start()33 r1.start()34 r2.start()
위 내용은 Python 학습 일기----스레드, 이벤트, 대기열의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











PHP는 주로 절차 적 프로그래밍이지만 객체 지향 프로그래밍 (OOP)도 지원합니다. Python은 OOP, 기능 및 절차 프로그래밍을 포함한 다양한 패러다임을 지원합니다. PHP는 웹 개발에 적합하며 Python은 데이터 분석 및 기계 학습과 같은 다양한 응용 프로그램에 적합합니다.

PHP는 웹 개발 및 빠른 프로토 타이핑에 적합하며 Python은 데이터 과학 및 기계 학습에 적합합니다. 1.PHP는 간단한 구문과 함께 동적 웹 개발에 사용되며 빠른 개발에 적합합니다. 2. Python은 간결한 구문을 가지고 있으며 여러 분야에 적합하며 강력한 라이브러리 생태계가 있습니다.

VS 코드는 파이썬을 작성하는 데 사용될 수 있으며 파이썬 애플리케이션을 개발하기에 이상적인 도구가되는 많은 기능을 제공합니다. 사용자는 다음을 수행 할 수 있습니다. Python 확장 기능을 설치하여 코드 완료, 구문 강조 및 디버깅과 같은 기능을 얻습니다. 디버거를 사용하여 코드를 단계별로 추적하고 오류를 찾아 수정하십시오. 버전 제어를 위해 git을 통합합니다. 코드 서식 도구를 사용하여 코드 일관성을 유지하십시오. 라인 도구를 사용하여 잠재적 인 문제를 미리 발견하십시오.

VS 코드는 Windows 8에서 실행될 수 있지만 경험은 크지 않을 수 있습니다. 먼저 시스템이 최신 패치로 업데이트되었는지 확인한 다음 시스템 아키텍처와 일치하는 VS 코드 설치 패키지를 다운로드하여 프롬프트대로 설치하십시오. 설치 후 일부 확장은 Windows 8과 호환되지 않을 수 있으며 대체 확장을 찾거나 가상 시스템에서 새로운 Windows 시스템을 사용해야합니다. 필요한 연장을 설치하여 제대로 작동하는지 확인하십시오. Windows 8에서는 VS 코드가 가능하지만 더 나은 개발 경험과 보안을 위해 새로운 Windows 시스템으로 업그레이드하는 것이 좋습니다.

VS 코드 확장은 악의적 인 코드 숨기기, 취약성 악용 및 합법적 인 확장으로 자위하는 등 악성 위험을 초래합니다. 악의적 인 확장을 식별하는 방법에는 게시자 확인, 주석 읽기, 코드 확인 및주의해서 설치가 포함됩니다. 보안 조치에는 보안 인식, 좋은 습관, 정기적 인 업데이트 및 바이러스 백신 소프트웨어도 포함됩니다.

Python은 부드러운 학습 곡선과 간결한 구문으로 초보자에게 더 적합합니다. JavaScript는 가파른 학습 곡선과 유연한 구문으로 프론트 엔드 개발에 적합합니다. 1. Python Syntax는 직관적이며 데이터 과학 및 백엔드 개발에 적합합니다. 2. JavaScript는 유연하며 프론트 엔드 및 서버 측 프로그래밍에서 널리 사용됩니다.

PHP는 1994 년에 시작되었으며 Rasmuslerdorf에 의해 개발되었습니다. 원래 웹 사이트 방문자를 추적하는 데 사용되었으며 점차 서버 측 스크립팅 언어로 진화했으며 웹 개발에 널리 사용되었습니다. Python은 1980 년대 후반 Guidovan Rossum에 의해 개발되었으며 1991 년에 처음 출시되었습니다. 코드 가독성과 단순성을 강조하며 과학 컴퓨팅, 데이터 분석 및 기타 분야에 적합합니다.

vs 코드에서는 다음 단계를 통해 터미널에서 프로그램을 실행할 수 있습니다. 코드를 준비하고 통합 터미널을 열어 코드 디렉토리가 터미널 작업 디렉토리와 일치하는지 확인하십시오. 프로그래밍 언어 (예 : Python의 Python Your_file_name.py)에 따라 실행 명령을 선택하여 성공적으로 실행되는지 여부를 확인하고 오류를 해결하십시오. 디버거를 사용하여 디버깅 효율을 향상시킵니다.
