由于最近一段时间,学了一门脚本语言-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])
这个就有点更坑爹,目前还不得其奥妙.........
分享到:
相关推荐
在Python编程中,多线程同步对于文件读写控制至关重要,因为如果不加以控制,多个线程同时访问同一文件可能会导致数据不一致或者错误。这里我们将深入探讨如何在Python中使用多线程同步来确保文件读写的安全性。 ...
Python 多线程编程实例,一个综合示例
这个是在学习python多线程的时候自己总结的文档,对理解Python多线程非常有帮助,很多都是从官方文档而来的。
Python多线程爬虫爬取电影天堂资源是一个实用且具有挑战的项目。以下是对该项目的详细说明: 1. 项目概述: 该项目旨在使用Python编写一个多线程爬虫程序,从电影天堂网站上爬取电影资源信息,包括电影名称、年份、类型...
python 多线程 实例 注释详解
本话题聚焦于使用Python进行OPC DA(OPC Data Access)的多线程读写操作。OPC DA是一种标准接口,允许应用程序与工业控制系统设备,如PLC(可编程逻辑控制器)进行通信。这里我们将详细探讨如何利用Python实现这一...
总结来说,"Python-HTTP大文件多线程下载工具支持断点续传"是一个结合了HTTP通信、多线程编程和文件操作的实例,对于提升Python网络编程能力,尤其是处理大文件下载问题,具有很高的学习价值。通过深入研究和实践,...
Python的多线程在io方面比单线程还是有优势,但是在多线程开发时,少不了对文件的读写操作。在管理多个线程对同一文件的读写操作时,就少不了文件锁了。 使用fcntl 在linux下,python的标准库有现成的文件锁,来自于...
在Python编程中,多线程是一种并发执行任务的机制,尤其在处理I/O密集型任务如网络请求时,能够显著提高程序效率。本教程将详细讲解如何使用Python的多线程来实现对多个网址的快速访问,并记录访问结果。 首先,...
总结起来,`python多线程定时器`的实现涉及到Python的`threading`和`time`模块,通过`Thread`和`Timer`类来创建和管理线程,使用定时器控制线程的启动时间。主程序`main.py`使用这些工具来安排多个任务按设定的间隔...
本压缩包“PYthon-multithreading-Test.rar”包含了有关Python多线程测试的源码,旨在帮助用户深入理解和实践Python的线程操作。 Python中的多线程是通过`threading`模块实现的,这个模块提供了基本的线程和同步...
Python多线程编程是利用Python实现程序并行性的一种方式,尤其适合于处理异步、并发事务和资源密集型任务。在多线程环境中,多个线程可以同时执行,提高程序效率,尤其对于那些需要从多个输入源处理数据或者进行大量...
本文将深入探讨“单线程与多线程Python爬虫地图瓦片源码”的相关知识点。 首先,我们需要理解“线程”这一概念。线程是程序执行的最小单元,每个线程负责执行特定的任务。在单线程环境中,程序按顺序执行,一次只能...
在这个"Python多线程示例"中,我们主要关注如何在Python环境中创建和管理线程。核心知识点包括: 1. **线程模块**:Python的`threading`模块提供了线程相关的所有功能。`Thread`类是其核心,通过实例化这个类可以...
总结起来,"python selenium chrome 多开 多线程"这个主题涉及到使用Python的Selenium库和Chrome浏览器进行多实例操作,通过多线程来并发执行任务,提升效率。同时,还需要理解Chromedriver和PhantomJS的作用,以及...
本文将深入探讨一个具体的Python多线程实例,该实例展示了如何在Python中实现串行与并行操作,并通过查询数据库的具体场景来说明这两种模式的区别。 #### 一、多线程基础 在讨论具体代码之前,我们先回顾一下多...
最后,`基于Linux的python多线程爬虫程序设计.pdf`很可能包含详细的教程和示例代码,读者可以结合这份文档深入学习多线程爬虫的实现细节。通过实际项目练习,可以更好地理解和掌握这一技术,提升自己的编程能力。在...
一个关于Python的thread多线程小实例 运行结果可以看出整体程序先结束,而调用线程的方法后结束
通过分析和学习这个文件,你可以进一步加深对Python多线程编程的理解,包括如何有效地使用线程池(`ThreadPoolExecutor`),以及如何处理线程异常和线程间的协作问题。 总之,Python的多线程编程虽然受到GIL的限制...
在Python编程环境下,可以利用多线程技术提高这种测试的效率。下面将详细介绍如何使用Python27实现多线程FTP密码破解。 首先,Python的`threading`模块是实现多线程的基础。它允许我们创建并控制多个执行线程,从而...