日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python多线程写同一文件_Python多线程写文件实例

發布時間:2023/12/13 python 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python多线程写同一文件_Python多线程写文件实例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

# -*- 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方便。

總結

以上是生活随笔為你收集整理的python多线程写同一文件_Python多线程写文件实例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。