Gidhub BE Developer

sys 모듈

2018-02-11
goodGid

sys 모듈

  • sys 모듈은 파이썬 인터프리터와 관련된 정보와 기능을 제공하는 모듈이다.

sys.argv

  • sys.argv는 파이썬 스크립트로 넘어온 인자의 리스트이다.

  • 0번째에는 스크립트 이름이 있으며, 그 이후부터 인자가 설정된다.


# python /Users/gy8971/Desktop/gid/1.Programming/Python/init.py test 실행시켰을 때

import sys

print("argv size : ", len(sys.argv))
for i, arg in enumerate(sys.argv):
    print(i, arg)



argv size :  2
0 /Users/gy8971/Desktop/gid/1.Programming/Python/init.py
1 test

sys.exc_info()

  • sys.exc_info()는 현재 발생한 예외 정보를 튜플로 반환한다.

  • 예외가 없는 경우에는 None을 반환한다.

import sys


print(sys.exc_info())


try:
    1/0
except:
    exc_class, val, tb_ob = sys.exc_info()
    print(exc_class)
    print(val)
    print(tb_ob)
    print(dir(tb_ob))
    print(tb_ob.tb_lineno)



    (None, None, None)
<class 'ZeroDivisionError'>
division by zero
<traceback object at 0x103963bc8>
['tb_frame', 'tb_lasti', 'tb_lineno', 'tb_next']
11

sys.prefix, sys.exec_prefix, sys.executable

  • sys.prefix, sys.exec_prefix, sys.executable은 파이썬이 설치된 경로와 실행 파일을 나타낸다.
import sys


print(sys.prefix)           # 파이썬이 설치된 경로
print(sys.exec_prefix)
print(sys.executable)       # 파이썬 인터프리터의 실행파일 경로


/Library/Frameworks/Python.framework/Versions/3.6
/Library/Frameworks/Python.framework/Versions/3.6
/Library/Frameworks/Python.framework/Versions/3.6/bin/python3

sys.exit([arg])

  • sys.exit([arg])은 프로세스를 종료 시킨다.

  • arg가 0인 경우는 정상 종료, 0이 아닌 경우에는 비정상 종료로 처리된다.


sys.copyright, sys.version

  • sys.copyright, sys.version은 설치된 파이썬의 저작권과 버전을 나타낸다.
import sys



print(sys.copyright)
print("===")
print(sys.version)
print("===")
print(sys.version_info)



Copyright (c) 2001-2017 Python Software Foundation.
All Rights Reserved.

Copyright (c) 2000 BeOpen.com.
All Rights Reserved.

Copyright (c) 1995-2001 Corporation for National Research Initiatives.
All Rights Reserved.

Copyright (c) 1991-1995 Stichting Mathematisch Centrum, Amsterdam.
All Rights Reserved.
===
3.6.4 (v3.6.4:d48ecebad5, Dec 18 2017, 21:07:28)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)]
===
sys.version_info(major=3, minor=6, micro=4, releaselevel='final', serial=0)

sys.getdefaultencoding()

  • sys.getdefaultencoding()은 현재 사용 중인 기본 문자열 인코딩을 반환한다.
import sys

print(sys.getdefaultencoding())

utf-8

threading 모듈

  • 쓰레드란 하나의 프로세스 내에서 진행되는 하나의 실행 단위를 뜻한다.

  • 하나의 프로세스에서 여러 실행 단위가 실행되는 것을 멀티 쓰레드라 한다.

  • 프로세스쓰레드는 모두 프로그램을 수행한다는 공통점을 지니고 있지만

    프로세스는 윈도우에서 여러 응용프로그램을 각각 실행시키는 것처럼

    독립적으로 실행되어 독립된 메모리 공간을 사용한다.

  • 멀티쓰레드하나의 프로세스내에서 여러 쓰레드가 프로세스 공간의 메모리공유해서 사용할 수 있다.


Thread.start()

  • 쓰레드를 시작할 때 사용한다.

Thread.run()

  • 쓰레드의 주요 동작을 정의한다.

Thread.join([timeout])

  • 쓰레드가 종료되기를 기다린다. [timeout]이 정의된 경우, 최대 정의된 시간만큼 기다린다.

Lock 객체

  • 하나의 프로세스에서 2개 이상의 쓰레드가 동시에 수행되는 경우

    쓰레드 간에 프로세스 공간의 메모리를 공유한다.

  • 만약 하나의 변수에 대해서 2개 이상의 쓰레드가 변경을 가하고자 한다면

    어떤 쓰레드가 먼저 수행되느냐에 따라 결과가 달라질 수 있다.


  • 이러한 상태를 경쟁 상태(Race condition)라고 한다.

  • 이러한 상황을 방지하기 위해서 파이썬에서는 Lock이라는 동기화 객체를 지원한다.


  • Lock객체는 locked와 unlocked의 2가지 상태를 가지며

    acquire()와 release()의 두 가지 함수만을 제공한다.


  • unlocked 상태에서 acquire()가 호출되면 locked 상태로 바뀌며

    locked 상태에서 release()가 호출되면 unlocked 상태로 바뀌게 된다.


  • locked 상태에서 다른 쓰레드가 acquire()를 호출하면

    locked 상태의 쓰레드가 release()할 때까지 멈추게 된다.


  • 다음 예제코드는 threading의 Thread와 Lock 객체를 이용해

    각각 버그를 수정하는 시뮬레이션 프로그램이다.

  • 전역 변수로 총 버그 개수를 정의해 놓고

    생성된 3개의 developer 쓰레드가

    각각 0.1초에 하나씩 버그를 해결해 나가게 된다.

  • 버그 개수가 0이 되어 모든 쓰레드가 종료되면

    각자 몇 개씩 버그를 해결했는지를 출력한다.


Example

from threading import Thread, Lock
# import thread
# import lock
import time

count = 10
lock = Lock()

class developer(Thread):
    def __init__(self,name):            # 초기화
        Thread.__init__(self)
        self.name = name
        self.fixed = 0

    def run(self):                      # 쓰레드 동작 정의
        global count
        while 1:
            lock.acquire()              # lock
            if count > 0 :
                count -= 1
                lock.release()          # unlock
                self.fixed += 1
                time.sleep(0.1)
            else :
                lock.release()          # unlock
                break


dev_list = []
for name in ['Shin', 'Woo', 'Choi']:
    dev = developer(name)               # thread 생성
    dev_list.append(dev)
    dev.start()                         # thread 시작
    

for dev in dev_list:
    dev.join()                          # wait
    print(dev.name, 'fixed', dev.fixed)


# 실행할 때마다 결과가 달라진다.

Shin fixed 3
Woo fixed 3
Choi fixed 4

Comments

Index