pythonモジュールのthreading:pythonでマルチスレッドを使用します.
13708 ワード
自己転載:http://hi.baidu.com/156544632/blog/item/48b54595fd9fb40e7af480fb.html
pythonはマルチスレッドをサポートし、nativeのスレッドです.主にthreadとthreadingの二つのモジュールによって実現されます.threadは下の方のモジュールです.threadingはthreadにいくつかの包装をしています.もっと便利に使われます.ここで言及したいのは、pythonのスレッドへのサポートがまだ不十分で、マルチCPUを利用することはできませんが、次のバージョンのpythonでは、この点を改善することを考えています. threadingモジュールの中では主にいくつかのスレッドの操作対象化を行い、Threadというクラスを作成しました.一般的にスレッドを使用すると、スレッドを作成するための関数として、この関数をThreadオブジェクトに伝達して実行させる2つのモードがあります.もう一つは、Threadから直接引き継ぎ、新しいクラスを作って、スレッド実行のコードをこの新しいクラスに入れます.この二つのやり方を見てみましょう.
pythonはマルチスレッドをサポートし、nativeのスレッドです.主にthreadとthreadingの二つのモジュールによって実現されます.threadは下の方のモジュールです.threadingはthreadにいくつかの包装をしています.もっと便利に使われます.ここで言及したいのは、pythonのスレッドへのサポートがまだ不十分で、マルチCPUを利用することはできませんが、次のバージョンのpythonでは、この点を改善することを考えています. threadingモジュールの中では主にいくつかのスレッドの操作対象化を行い、Threadというクラスを作成しました.一般的にスレッドを使用すると、スレッドを作成するための関数として、この関数をThreadオブジェクトに伝達して実行させる2つのモードがあります.もう一つは、Threadから直接引き継ぎ、新しいクラスを作って、スレッド実行のコードをこの新しいクラスに入れます.この二つのやり方を見てみましょう.
#-*- encoding: gb2312 -*-
import string, threading, time
def thread_main(a):
global count, mutex
#
threadname = threading.currentThread().getName()
for x in xrange(0, int(a)):
#
mutex.acquire()
count = count + 1
#
mutex.release()
print threadname, x, count
time.sleep(1)
def main(num):
global count, mutex
threads = []
count = 1
#
mutex = threading.Lock()
#
for x in xrange(0, num):
threads.append(threading.Thread(target=thread_main, args=(10,)))
#
for t in threads:
t.start()
#
for t in threads:
t.join()
if __name__ == '__main__':
num = 4
# 4
main(4)
上面的就是第一种做法,这种做法是很常见的,下面是另一种,曾经使用过Java的朋友应该很熟悉这种模式:
#-*- encoding: gb2312 -*-
import threading
import time
class Test(threading.Thread):
def __init__(self, num):
threading.Thread.__init__(self)
self._run_num = num
def run(self):
global count, mutex
threadname = threading.currentThread().getName()
for x in xrange(0, int(self._run_num)):
mutex.acquire()
count = count + 1
mutex.release()
print threadname, x, count
time.sleep(1)
if __name__ == '__main__':
global count, mutex
threads = []
num = 4
count = 1
#
mutex = threading.Lock()
#
for x in xrange(0, num):
threads.append(Test(10))
#
for t in threads:
t.start()
#
for t in threads:
t.join()