#정리
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()