Python マルチスレッド

Python マルチスレッド。Python インタープリタ内では複数のスレッドを実行できますが、一度にインタープリタによって実行されるスレッドは 1 つだけであり、これは Python 仮想マシンの GIL (グローバル インタープリタ ロック) によって保証されることに注意してください。I/O によって GIL が解放されるため、Python マルチスレッドは CPU バウンド アプリケーションよりも I/O バウンド アプリケーションに適しています。

Python multithreading programming with thread module (for test only)

#!/usr/bin/env python
# coding=utf-8

import thread
import time

def printer_A(lock):
    print "A starts at: ", time.ctime()
    time.sleep(4)
    print "A finishes at: ", time.ctime()
    lock.release()

def printer_B(lock):
    print "B starts at: ", time.ctime()
    time.sleep(2)
    print "B finishes at: ", time.ctime()
    lock.release()

if __name__ == "__main__":
    print "Main starts at: ", time.ctime()
    lockA = thread.allocate_lock()
    lockA.acquire()
    thread.start_new_thread(printer_A, (lockA,))
    lockB = thread.allocate_lock()
    lockB.acquire()
    thread.start_new_thread(printer_B, (lockB,))
    while lockA.locked(): pass
    while lockB.locked(): pass
    print "Main finishes at: ", time.ctime()

# output
Main starts at:  Tue Mar 29 16:40:57 2016
B starts at:  Tue Mar 29 16:40:57 2016
A starts at:  Tue Mar 29 16:40:57 2016
B finishes at:  Tue Mar 29 16:40:59 2016
A finishes at:  Tue Mar 29 16:41:01 2016
Main finishes at:  Tue Mar 29 16:41:01 2016
[Finished in 4.093s]

Python multithreading programming with threading module

  • Similar to thread module, pass function to Thread instance:
#!/usr/bin/env python
# coding=utf-8

import threading
import time

def printA():
  print "A starts at: ", time.ctime()
  time.sleep(4)
  print "A finishes at: ", time.ctime()

def printB():
  print "B starts at: ", time.ctime()
  time.sleep(2)
  print "B finishes at: ", time.ctime()

if __name__ == "__main__":
  print "Main starts at: ", time.ctime()
  t_A = threading.Thread(target=printA, args=())
  t_B = threading.Thread(target=printB, args=())
  t_A.start()
  t_B.start()
  t_A.join()
  t_B.join()
  print "Main finishes at: ", time.ctime()

# output
Main starts at:  Wed Mar 30 10:53:44 2016
A starts at:  Wed Mar 30 10:53:44 2016
B starts at:  Wed Mar 30 10:53:44 2016
B finishes at:  Wed Mar 30 10:53:46 2016
A finishes at:  Wed Mar 30 10:53:48 2016
Main finishes at:  Wed Mar 30 10:53:48 2016
[Finished in 4.074s]
  • Subclass Thread and create subclass instance:
#!/usr/bin/env python
# coding=utf-8

import threading
import time

class MyThread(threading.Thread):
  def __init__(self, func, args, name=''):
    threading.Thread.__init__(self)
    self.name = name
    self.func = func
    self.args = args

  def run(self):
    self.func(*self.args)

def printA():
  print "A starts at: ", time.ctime()
  time.sleep(4)
  print "A finishes at: ", time.ctime()

def printB():
  print "B starts at: ", time.ctime()
  time.sleep(2)
  print "B finishes at: ", time.ctime()

if __name__ == "__main__":
  print "Main starts at: ", time.ctime()
  t_A = MyThread(printA, ())
  t_B = MyThread(printB, ())
  t_A.start()
  t_B.start()
  t_A.join()
  t_B.join()
  print "Main finishes at: ", time.ctime()

# output
Main starts at:  Wed Mar 30 11:05:57 2016
A starts at:  Wed Mar 30 11:05:57 2016
B starts at:  Wed Mar 30 11:05:57 2016
B finishes at:  Wed Mar 30 11:05:59 2016
A finishes at:  Wed Mar 30 11:06:01 2016
Main finishes at:  Wed Mar 30 11:06:01 2016
[Finished in 4.11s]

python multithreading