`
michael8335
  • 浏览: 184044 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Python多线程写文件实例

阅读更多
由于最近一段时间,学了一门脚本语言-Python,原因是一、公司需要;二、只掌握Java感觉还是不够。
由于需要用python分析日志,但是日志实际还没有,格式已经定了,所以我先用python写了个多线程写文件的工具,比较简单,作为一个学习总结吧,同时还遇到了一个问题,顺便将问题和解决方法也总结一下。
需求:两个线程同时向一个文件中写固定格式的文件
实际代码:
# -*- coding: utf-8 -*-

import threading

'''
多线程生成日志工具
'''

__author = [
    '"yangfei" <yangfei@ptmind.com>'
]

#该方法主要用于写入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
分享到:
评论
2 楼 bluky999 2016-01-11  
这个存在同步问题,会导致你的写入串行或者顺序不符合预期,需要加一个 RLock  ;

或者可以不用自己写文件,而是要logging模块,支持多线程。
1 楼 somefuture 2012-11-30  
从Java转向python的时候,刚开始会很兴奋,觉得很奇妙。比如限制整数大小时,可以3<a<7,其他语言不可以。
不过随着深入,就发现各个脚本差不多,还是js方便。

相关推荐

    Python 多线程编程实例

    Python 多线程编程实例,一个综合示例

    Python多线程编程详细示例

    这个是在学习python多线程的时候自己总结的文档,对理解Python多线程非常有帮助,很多都是从官方文档而来的。

    python多线程 实例 注释详解

    python 多线程 实例 注释详解

    对Python多线程读写文件加锁的实例详解

    Python的多线程在io方面比单线程还是有优势,但是在多线程开发时,少不了对文件的读写操作。在管理多个线程对同一文件的读写操作时,就少不了文件锁了。 使用fcntl 在linux下,python的标准库有现成的文件锁,来自于...

    Python的多线程小实例

    一个关于Python的thread多线程小实例 运行结果可以看出整体程序先结束,而调用线程的方法后结束

    Python多线程示例

    Python的多线程示例程序。zip压缩包里只有一个run.py文件,演示怎么在python里使用多线程。

    InsightScan, 在 python 中,单个文件多线程 portscanner.zip

    InsightScan, 在 python 中,单个文件多线程 portscanner InsightScan一种基于 python的单文件多线程端口扫描用法:InsightScan.py [/24|/CIDR]&gt; [start port] [end port] -t线程示例:InsightSc

    python多线程编程示例(threading.py)

    1、多线程的理解 多进程和多线程都可以执行多个任务,线程是进程的一部分。...2、Python多线程创建 在Python中,同样可以实现多线程,有两个标准模块thread和threading,不过我们主要使用 更高级的threading模块。

    python多线程实现TCP服务端

    本文实例为大家分享了python多线程实现TCP服务端的具体代码,供大家参考,具体内容如下 需求 1.创建一个TCP服务器接收服务端发送的信息并给予答复 2.以多线程方式实现接收客户端信息 3.间客户端发送的信息解码...

    python 多线程串行和并行的实例

    今天小编就为大家分享一篇python 多线程串行和并行的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    python多线程实例

    多线程实例,测试案例,对多线程编程理解可以进一步加深

    浅谈PyQt5中异步刷新UI和Python多线程总结

    目前任务需要做一个界面程序,PyQt是非常方便的选择,QT丰富的控件以及python方便的编程。近期遇到界面中执行一些后台任务时界面卡死的情况,解决了在这里记录下。 PyQt PyQt简介 PyQt是Qt的python接口,PyQt的文档...

    Python多进程写入同一文件的方法

    最近用python的正则表达式处理了一些文本数据,需要把结果写到文件里面,但是由于文件比较大,所以运行起来花费的时间很长。但是打开任务管理器发现CPU只占用了25%,上网找了一下原因发现是由于一个叫GIL的存在,...

    python多线程 实例Thread 派生子类,创建子类实例

    python多线程 实例 注释详解 从 Thread 派生出一个子类,创建一个这个子类的实例

    python多线程

    基于python的多线程示例,跨平台,可用于windows和ubuntu系统中

    python selenium chrome 多开 多线程

    phantomjs.exe,chromedriver.exe文件改个名字 填上绝对路径 就可以打开多个浏览器对象 .包含 phantomjs.exe,chromedriver.exe 和示例

    python多线程分块读取文件

    本文实例为大家分享了python多线程分块读取文件的具体代码,供大家参考,具体内容如下 # _*_coding:utf-8_*_ import time, threading, ConfigParser ''' Reader类,继承threading.Thread @__init__方法初始化 @run...

    多线程Python程序示例

    多线程Python程序示例

Global site tag (gtag.js) - Google Analytics