我是Python的新手,似乎我必须编写一个能够并行工作的脚本。好吧,我决定尝试构建一个多线程脚本,我觉得它实际工作正常。在做研究的过程中,我发现了许多例子,但只有少数例子适合我。最后我读了this question (Stackoverflow questions/474528 - second Answer - fifths comment):
shed模块的文档也指向threading.Timer类,它更适合多线程环境。
对我而言,这听起来像是线程。在这种情况下,对我来说,定时器是更好的功能。然后我想知道为什么......也许在我继续之前,在上面的同一个链接上,对第二个答案的第一个评论,有人在问
sched模块用于调度函数在一段时间后运行,如何在不使用time.sleep()的情况下每隔x秒重复一次函数调用?
现在我在考虑,如果我必须循环和睡眠,功能如何更好或不好。我的意思是Timer的第一个参数只表示他应该等多久才能开始。我试了一下解决方法:
#! C:\Python34\env python.exe
# -*- coding: utf-8 -*-
import threading
import time
class c_Thread ( threading.Thread ):
sThreadName = ''
iThreadInterval = 0
def __init__ ( self, sThreadName, iThreadInterval ):
threading.Thread.__init__ ( self )
self.sThreadName = sThreadName
self.iThreadInterval = iThreadInterval
print ( )
def run ( self ):
print ( "Starting " + self.sThreadName )
print_time ( self.sThreadName, self.iThreadInterval )
print ( "Exiting " + self.sThreadName )
print ( )
def print_time( sThreadName, iThreadInterval):
while True:
time.sleep(iThreadInterval)
print ( sThreadName + ": " + time.ctime ( time.time ( ) ) )
Thread1 = c_Thread ( "ThreadOne", 2 )
Thread2 = c_Thread ( "ThreadTwo", 5 )
Thread1.start ( )
Thread2.start ( )
print ("Exiting Main Thread")
这个脚本工作正常。现在我想好了,但是为什么我应该使用睡眠,如果Timer函数无论如何都具有相同的功能。所以我试过了:
#! C:\Python34\env python.exe
# -*- coding: utf-8 -*-
import threading
import time
class c_Thread ( threading.Thread ):
sThreadName = ''
iThreadInterval = 0
def __init__ ( self, sThreadName, iThreadInterval ):
threading.Thread.__init__ ( self )
self.sThreadName = sThreadName
self.iThreadInterval = iThreadInterval
def run ( self ):
print ( "Register Timer-Thread: " + self.sThreadName )
while True:
hTimer = threading.Timer ( self.iThreadInterval, print_time, ( self.sThreadName ) )
hTimer . start ( )
def print_time( sThreadName ):
print ( sThreadName + ": " + time.ctime ( time.time ( ) ) )
Thread1 = c_Thread ( "One", 2 )
Thread2 = c_Thread ( "Two", 5 )
Thread1 . start ( )
Thread2 . start ( )
但实际上我没有让这个运行正确...我收到了这个错误:
TypeError:print_time()需要1个位置参数,但有3个被赋予
我做了一些研究,我发现'self'是第一个对象,所以我在print_time上的参数上添加了self。
def print_time( self, sThreadName ):
一开始我只将'sTreadI'作为参数。所以第二个是“sTread”,但是第三个来自哪里呢?
我做了调试打印,添加了第三个参数但不使用它。
def print_time( self, sThreadName, idk ):
#print ( "self: " + self )
#print ( "sThreadName: " + sThreadName )
#print ( "idk: " + idk)
#print ( )
print ( sThreadName + ": " + time.ctime ( time.time ( ) ) )
但是'sTreadID'不正确,它总是像单个字母(例如'n')......也许在这一点上有人可以帮助我吗?
除了'sTreadI'错误之外,如果我在我的函数上使用了3个参数而忽略了第三个参数(没有用),我的脚本没有做我期望的事情。我期待与上面发布的第一个脚本完全相同的行为。为什么不是这种情况。我真的想要解决这个问题。
到目前为止,感谢所有想要帮助我的人的建议。 此致,迈克。
环境: Windows 7专业版64位 Python 3.4 代码编辑器:Notepad ++ 通过'python -tt script.py'
在CMD上运行答案 0 :(得分:0)
改变这个:
def run ( self ):
print ( "Register Timer-Thread: " + self.sThreadName )
while True:
hTimer = threading.Timer ( self.iThreadInterval, print_time, ( self.sThreadName ) )
hTimer . start ( )
太:
def run ( self ):
print ( "Register Timer-Thread: " + self.sThreadName )
while True:
hTimer = threading.Timer ( self.iThreadInterval, print_time( self.sThreadName ) )
hTimer . start ( )
所以只是:“print_time,(self.sThreadName)”应该没有逗号“print_time(self.sThreadName)”