# -*- coding: utf-8 -*-
import threading
'''
多線程生成日志工具
'''
__author = [
'"yangfei" '
]
#該方法主要用于寫入300行WARN日志
def writeWarnLog(file):
count=0;
while count<300:
try:
file.write('2012-11-28 22:51:01|zookeeper|WARN|m1|172.17.1.15\n')
count+=1
except Exception ,e:
print 'write warn log error',str(e)
break
print 'write warn log finished'
#該方法主要用于寫入100行ERROR日志
def writeErrorLog(file):
count=0;
while count<100:
try:
file.write('2012-12-12 22:22:22|zookeeper|ERROR|m1|all\n')
count+=1
except Exception ,e:
print 'write error log error',str(e)
break
print 'write error log finished'
def main():
fileName='zookeeper.log'
mode='w+' #通過追加寫日志文件
#創建兩個線程來寫文件
try:
f=open(fileName,mode)
t1=threading.Thread(target=writeWarnLog,args=(f))
t2=threading.Thread(target=writeErrorLog,args=(f))
t1.start()
t2.start()
t1.join()
t2.join()
except Exception,e:
print 'write log failed,',str(e)
finally:
f.close()
print 'write log finished'
if __name__=='__main__':
main()
這上面的代碼存在Bug,直接運行的話,會出現如下錯誤信息:
Exception in thread Thread-2:
Traceback (most recent call last):
File "/opt/python/lib/python2.7/threading.py", line 551, in __bootstrap_inner
self.run()
File "/opt/python/lib/python2.7/threading.py", line 504, in run
self.__target(*self.__args, **self.__kwargs)
TypeError: writeErrorLog() takes exactly 1 argument (0 given)
Exception in thread Thread-1:
Traceback (most recent call last):
File "/opt/python/lib/python2.7/threading.py", line 551, in __bootstrap_inner
self.run()
File "/opt/python/lib/python2.7/threading.py", line 504, in run
self.__target(*self.__args, **self.__kwargs)
TypeError: writeWarnLog() takes exactly 1 argument (0 given)
異常是說,兩個線程的執行的方法需要一個參數,而我并沒有給參數,但是通過實際代碼查看,明明是都給了一個參數:
t1=threading.Thread(target=writeWarnLog,args=(f))
t2=threading.Thread(target=writeErrorLog,args=(f))
剛開始我遇到這個問題,感覺很奇怪,明明是給了參數的,但是為什么還說,沒有提供參數呢??代碼邏輯上也沒有錯啊,搞不定!
然后查詢了Python的API,發現關于args的說明是這樣的:
args is the argument tuple for the target invocation. Defaults to ().
就是說,這個args是個元組,必須傳一個元組,而我這里給的(f)并不是一個元組,如果元組只有一個元素時,格式應該是(element,),不能少了那個逗號,也就是說上門兩行代碼應該寫成如下格式:
t1=threading.Thread(target=writeWarnLog,args=(f,))
t2=threading.Thread(target=writeErrorLog,args=(f,))
修改之后,執行成功,不小心導致的,坑爹啊!
但是!
我試了一下,如果把那兩行代碼中,參數改為數組格式,照樣執行成功,即:
t1=threading.Thread(target=writeWarnLog,args=[f])
t2=threading.Thread(target=writeErrorLog,args=[f])
這個就有點更坑爹,目前還不得其奧妙.........
5
頂
0
踩
分享到:
2012-11-29 18:29
瀏覽 19866
評論
2 樓
bluky999
2016-01-11
這個存在同步問題,會導致你的寫入串行或者順序不符合預期,需要加一個 RLock? ;
或者可以不用自己寫文件,而是要logging模塊,支持多線程。
1 樓
somefuture
2012-11-30
從Java轉向python的時候,剛開始會很興奮,覺得很奇妙。比如限制整數大小時,可以3
不過隨著深入,就發現各個腳本差不多,還是js方便。