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

博客探讨了在Python中使用多线程写入同一文件时出现的TypeError异常,原因是参数传递方式不正确。通过修改args为元组或列表形式解决了问题,但同时也提到了这样做可能存在的同步问题,并建议使用RLock或logging模块以确保线程安全。
摘要由CSDN通过智能技术生成

# -*- 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

分享到:

18e900b8666ce6f233d25ec02f95ee59.png

72dd548719f0ace4d5f9bca64e1d7715.png

2012-11-29 18:29

浏览 19866

评论

2 楼

bluky999

2016-01-11

这个存在同步问题,会导致你的写入串行或者顺序不符合预期,需要加一个 RLock  ;

或者可以不用自己写文件,而是要logging模块,支持多线程。

1 楼

somefuture

2012-11-30

从Java转向python的时候,刚开始会很兴奋,觉得很奇妙。比如限制整数大小时,可以3

不过随着深入,就发现各个脚本差不多,还是js方便。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值