본문 바로가기

Python

[Python] 14. 쓰레드(threading ), 쓰레드 함수(40threading_def ), 파이프(pipe), GUI 제작용 내장 툴(GUI_tkinter)

#정리

39 threading - 쓰레드

#import threading
#import time
#쓰레드를 상속 받음으로써, 쓰레드객체로 변경됨.

 - 쓰레드를 사용하여 클래스 내에 함수를 실행하고자 하는 경우 쓰레드를 상속받아야 한다.

 - class Messenger(threading.Thread): #쓰레드 상속 필요

#쓰레드 이름 설정 및 쓰레드 활성화

<1.클래스 객체 생성과 함께 쓰레드 이름 부여 및 활성화>

 - Messenger(name="1chang").start() #쓰레드 네임 "1chang" / .start() >> 쓰레드 활성화
<2.변수에 객체 할당 후, 별도로 쓰레드 이름 부여 및 활성화>

 - m2 = Messenger2()
 >> m2.setName("2kim")
 >> m2.start()

#쓰레드 관련 함수
 - print("m2.isAlive()",m2.isAlive()) #쓰레드 활성화 여부 참 거짓 반환
 - m2.join() #하단의 m3스레드는 대기한다.
 - print("threading.enumerate():",threading.enumerate()) #현재 활성화된 쓰레드 정보를 리스트로 반환
 - print("threading.activeCount():",threading.activeCount()) #현재 활성화된 쓰레드 갯수 반환
 - print("threading.currentThread():",threading.currentThread()) #현재 활성화된 쓰레드 정보 반환


#40threading_def -  쓰레딩 함수 바로 이용

#쓰레드 이름 없이, 함수를 타겟으로 바로 쓰레드를 돌릴 수 있다.
 - threading.Thread(target=run).start() #.start()를 안쓰면 Thead란 함수의 일반 함수 호출이된다.

#함수를 쓰레딩 객체로 변수에 할당하여, 쓰레드 이름 지정 후 쓰레드를 활성화 시킬 수 있다.

 - t2 = threading.Thread(target=run)
  >> t2.setName("chang") #이름을 할당하지 않으면 Tread-(숫자)로 임의 지정 된다.
  >> t2.start()
#함수 호출 시, 아규먼트는 args=(아규먼트)형태로 넣는다.
 - threading.Thread(target=test,args=(11,22,33,44)).start()



#42GUI_tkinter.py - UI 제작을 위한 내장 툴 

#from tkinter import *
#GUI의 가장 바깥 껍데기
 - top = Tk( )  >>   top.mainloop()

#"250x100+0+0" (0.0)좌표에 250*100크기의 창 생성
 - top.geometry("250x100+0+0")

#리스트 박스 생성 및 리스트 삽입

 - lstbox = Listbox(top)
 >> lstbox.pack()
 - lstbox.bind("<<ListboxSelect>>",onselected) #"<<ListboxSelect>>" >> 예약어
 >>lstbox.insert(0,"python1 gui1") #더미 값 입력
 - index = event.widget.curselection()[0] #선택한 순번 반환
 - select_item = event.widget.get(index) #선택된 순번의 내용

#라벨(입력 공간 제목) 생성 
 - nameLabel = Label(top,text="NAME:") #라벨(입력공간 제목) 생성
 >> nameLabel.grid() #grid layout #라벨 위치 지정
#입력창 생성 및 배치
 - nameEntry = Entry(top) #엔트리(입력 공간) 생성
 >>nameEntry.insert(0,"chang") #입력 기본값 지정

 >> nameEntry.grid(row=0,column=1) #엔트리 위치 지정
#버튼 생성 및 배치
 - okButton = Button(top,text="OK",command=onclick) #버튼 생성 및 실행 명령(함수) 지정

 >> okButton.grid(row=2,column=1) #버튼 위치 지정

#창 닫기 (종료)

  - top.destroy() #window close

 

 

 

#39 threading - 쓰레드

#import threading
#import time
#쓰레드를 상속 받음으로써, 쓰레드객체로 변경됨.

 - 쓰레드를 사용하여 클래스 내에 함수를 실행하고자 하는 경우 쓰레드를 상속받아야 한다.

 - class Messenger(threading.Thread): #쓰레드 상속 필요

더보기
class Messenger(threading.Thread): #쓰레드 상속 필요
def run(self):
for _ in range(10):
time.sleep(0.2)
print(threading.currentThread().getName()) #현재 돌고 있는 쓰레드명 출력

#쓰레드 이름 설정 및 쓰레드 활성화

<1.클래스 객체 생성과 함께 쓰레드 이름 부여 및 활성화>

 - Messenger(name="1chang").start() #쓰레드 네임 "1chang" / .start() >> 쓰레드 활성화
<2.변수에 객체 할당 후, 별도로 쓰레드 이름 부여 및 활성화>

 - m2 = Messenger2()
 >> m2.setName("2kim")
 >> m2.start()

#쓰레드 관련 함수
 - print("m2.isAlive()",m2.isAlive()) #쓰레드 활성화 여부 참 거짓 반환
 - m2.join() #하단의 m3스레드는 대기한다.
 - print("threading.enumerate():",threading.enumerate()) #현재 활성화된 쓰레드 정보를 리스트로 반환
 - print("threading.activeCount():",threading.activeCount()) #현재 활성화된 쓰레드 갯수 반환
 - print("threading.currentThread():",threading.currentThread()) #현재 활성화된 쓰레드 정보 반환

 

--예문 코드 보기--

더보기
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import threading
import time
print("---------------")
class Messenger(threading.Thread):
	def run(self):
		for _ in range(10):
			time.sleep(0.2)
			print(threading.currentThread().getName())
			
print("---------------")
#쓰레드를 상속 받음으로써, 쓰레드객체로 변경됨.
class Messenger2(threading.Thread):
	def run(self):
		for _ in range(10):
			time.sleep(0.5)
			print(threading.currentThread().getName())		
				
print("---------------")

class Messenger3(threading.Thread):
	def run(self):
		for _ in range(10):
			time.sleep(0.5)
			print(threading.currentThread().getName())			
			
print("---m1 start()-------")
#tread name setting
Messenger(name="1chang").start()
print("---m2 start()-------")
m2 = Messenger2()
m2.setName("2kim")
m2.start()
print("m2.isAlive()",m2.isAlive())
m2.join() #하단의 m3스레드는 대기한다.
print("threading.enumerate():",threading.enumerate())
print("threading.activeCount():",threading.activeCount())
print("threading.currentThread():",threading.currentThread())

print("---m3 start()-------")
m3 = Messenger3()
m3.setName("3park")
m3.start()
print("threading.enumerate():",threading.enumerate())
print("threading.activeCount():",threading.activeCount())
print("threading.currentThread():",threading.currentThread())

 

 


 

#40threading_def -  쓰레딩 함수 바로 이용

#쓰레드 이름 없이, 함수를 타겟으로 바로 쓰레드를 돌릴 수 있다.
 - threading.Thread(target=run).start() #.start()를 안쓰면 Thead란 함수의 일반 함수 호출이된다.

#함수를 쓰레딩 객체로 변수에 할당하여, 쓰레드 이름 지정 후 쓰레드를 활성화 시킬 수 있다.

 - t2 = threading.Thread(target=run)
  >> t2.setName("chang") #이름을 할당하지 않으면 Tread-(숫자)로 임의 지정 된다.
  >> t2.start()
#함수 호출 시, 아규먼트는 args=(아규먼트)형태로 넣는다.
 - threading.Thread(target=test,args=(11,22,33,44)).start()

 

--예문 코드 보기--

더보기
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import threading
import time

print("Hello python")
print("---------------")
def run():
	for _ in range(10):
		time.sleep(0.2)
		print(threading.currentThread().getName())

#아래 "-----"표시가 먼저 찍히는 것을 보고, 쓰레드가 돌고 있음을 알 수 있다.
#쓰레드 이름은 없이, 함수를 타겟으로 바로 쓰레드를 돌린다.
#threading.Thread(target=run).start() #.start()를 안쓰면 일반 함수 호출이된다.
threading.Thread(target=run) #.start()를 안쓰면 Thead란 함수의 일반 함수 호출이된다.
print("---------------")

t2 = threading.Thread(target=run)
t2.setName("chang")
t2.start()
print("---------------")

def test(*args):
	for i in range(len(args)):
		time.sleep(0.2)
		print(args[i])
		
threading.Thread(target=test,args=(11,22,33,44)).start()

 

 


#41pipe - 파이프 함수 

#import os #pipe
#pipe() : 인터렉션(입출력)을 위한 것으로, 내부적인 프로세스 안에서 읽기/쓰기를 위한 공간(파일)을 생성한 뒤
특정 임의의 정수에 파일을 지정하여 반환함.
 - receive,transmit = os.pipe() #tuple type은 두 값을 동시에 두 변수에 할당 할 수 있다. 

#os.write() : transmit 변수(혹은 파일)에 실제로 작성된 바이트 수를 반환한다. 
 - print(os.write(transmit,data.encode())) #os.write() >> return data length
#os.receive() : pipe 함수를 통해 지정된 transmit으로 쓰여진 바이트객체를 receive 변수를 통해 다시 읽어온다.
 - recv_data = os.read(receive, 1024) #os.read() >> return bytes type

 

--예문 코드 보기--

더보기
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os #pipe

print("Hello python")
print("---------------")
#pipe() : 인터렉션(입출력)을 위한 것으로, 함수를 통해 특정 정수형태로 파일을 지정하여 대표 정수를 반환함.
tp = os.pipe() #os.pipe() >> return tuple type
receive,transmit = os.pipe() #tuple type은 두 값을 동시에 두 변수에 할당 할 수 있다. 
print(tp)
print(receive,transmit) 
print(transmit)

print("---transmit-----")
data = "chang12345"
#transmit 변수(혹은 파일)에 실제로 작성된 바이트 수를 반환한다. 
print(os.write(transmit,data.encode())) #os.write() >> return data length
print(data.encode()) #os.write() >> return data length
print("---receive-----")
#pipe 함수를 통해 지정된 transmit으로 쓰여진 바이트객체를 receive 변수를 통해 다시 읽어온다.
recv_data = os.read(receive, 1024) #os.read() >> return bytes type
print(type(recv_data), recv_data)  
print(recv_data.decode("utf-8"))

 

 


 

#42GUI_tkinter.py - UI 제작을 위한 내장 툴 

#from tkinter import *
#GUI의 가장 바깥 껍데기
 - top = Tk( )  >>   top.mainloop()

#"250x100+0+0" (0.0)좌표에 250*100크기의 창 생성
 - top.geometry("250x100+0+0")

#리스트 박스 생성 및 리스트 삽입

 - lstbox = Listbox(top)
 >> lstbox.pack()
 - lstbox.bind("<<ListboxSelect>>",onselected) #"<<ListboxSelect>>" >> 예약어
 >>lstbox.insert(0,"python1 gui1") #더미 값 입력
 - index = event.widget.curselection()[0] #선택한 순번 반환
 - select_item = event.widget.get(index) #선택된 순번의 내용

 

더보기
		lstbox = Listbox(top)
		lstbox.pack()
		
		def onselected(event):
			index = event.widget.curselection()[0] #선택한 순번 반환
			print("onselected()...",index)
			select_item = event.widget.get(index) #선택된 순번의 내용
			print(select_item)
		
		lstbox.bind("<<ListboxSelect>>",onselected) #"<<ListboxSelect>>" >> 예약어
		
		lstbox.insert(0,"python1 gui1")#더미값 삽입
		lstbox.insert(0,"python2 gui2")
		lstbox.insert(0,"python3 gui3")
		lstbox.insert(0,"python4 gui4")
		lstbox.insert(0,"python5 gui5")

#라벨(입력 공간 제목) 생성 
 - nameLabel = Label(top,text="NAME:") #라벨(입력공간 제목) 생성
 >> nameLabel.grid() #grid layout #라벨 위치 지정
#입력창 생성 및 배치
 - nameEntry = Entry(top) #엔트리(입력 공간) 생성
 >>nameEntry.insert(0,"chang") #입력 기본값 지정

 >> nameEntry.grid(row=0,column=1) #엔트리 위치 지정
#버튼 생성 및 배치
 - okButton = Button(top,text="OK",command=onclick) #버튼 생성 및 실행 명령(함수) 지정

 >> okButton.grid(row=2,column=1) #버튼 위치 지정

#창 닫기 (종료)

  - top.destroy() #window close

 

 

--예문 코드 보기--

더보기
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from tkinter import *

print("Hello python")

class ListPage:
	def __init__(self):
		#GUI의 가장 바깥 껍데기
		top = Tk()
		#"250x100+0+0" (0.0)좌표에 250*100크기의 창 생성
		top.geometry("250x100+0+0")
		
		lstbox = Listbox(top)
		lstbox.pack()
		
		def onselected(event):
			index = event.widget.curselection()[0] #선택한 순번 반환
			print("onselected()...",index)
			select_item = event.widget.get(index) #선택된 순번의 내용
			print(select_item)
		
		lstbox.bind("<<ListboxSelect>>",onselected) #"<<ListboxSelect>>" >> 예약어
		
		lstbox.insert(0,"python1 gui1")#더미값 삽입
		lstbox.insert(0,"python2 gui2")
		lstbox.insert(0,"python3 gui3")
		lstbox.insert(0,"python4 gui4")
		lstbox.insert(0,"python5 gui5")

		
		top.mainloop()


print("--insertPage--")

class InsertPage:
	def __init__(self):
		#GUI의 가장 바깥 껍데기
		top = Tk()
		#"250x100+0+0" (0.0)좌표에 250*100크기의 창 생성
		top.geometry("250x100+0+0")
		
		#라벨 생성
		nameLabel = Label(top,text="NAME:")
		ageLabel = Label(top,text="AGE:")
		nameLabel.grid() #grid layout
		ageLabel.grid()
		
		#입력창 생성
		nameEntry = Entry(top)
		ageEntry = Entry(top)
		
		nameEntry.insert(0,"chang")
		ageEntry.insert(0,"33")
		
		nameEntry.grid(row=0,column=1)
		ageEntry.grid(row=1,column=1)
		
		def onclick():
			print("onclick()...")
			print("name:",nameEntry.get())
			print("name:",ageEntry.get())
			
			top.destroy() #window close
			ListPage()
			
		#버튼 생성
		okButton = Button(top,text="OK",command=onclick)
		okButton.grid(row=2,column=1)
		
		top.mainloop()

print("---------------")

InsertPage()