我有一个代码,打印出鼠标坐标( x,y)和时间戳每100‘s。我想让它运行10秒,。就这样。
因此,我实现了"multiprocessing“,并初始化它,从多处理函数内部调用主函数"printevery100ms",并告诉它10秒后关闭。
但是它没有在10秒后关闭,而是跳过p.terminate()命令,继续运行和运行.
,这是代码.
import multiprocessing
import time
import threading
import datetime
def printevery100ms():
threading.Timer(.1,printevery100ms).start()
ts = time.time()
st = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S')
from ctypes import windll,Structure,c_int,byref
class POINT(Structure):
_fields_ = [("x",c_int),("y",c_int)]
def queryMousePosition():
pt = POINT()
windll.user32.GetCursorPos(byref(pt))
return {"x": pt.x,"y": pt.y}
pos = queryMousePosition()
print('{{\'x\': {}, \'y\': {}}}'.format(pos['x'],pos['y']),st)
printevery100ms()
if __name__ == '__main__':
# Start printevery100ms as a process
p = multiprocessing.Process(target=printevery100ms, name="printevery100ms", args=(10,))
p.start()
# Wait 10 seconds for printevery100ms
time.sleep(10)
# Terminate printevery100ms
p.terminate()
p.join()
print "Not Terminated"因此,多处理代码初始化10秒计时器,它应该在10秒后关闭它,这就是终止命令的目的。我编写了一个print命令,如果代码在10秒后仍未停止,则打印出"Not“;这正是所发生的情况。
这里的结果是:( 9秒后..)
("{'x': 1255, 'y': 395}", '2017-01-19 13:31:58')
("{'x': 1255, 'y': 395}", '2017-01-19 13:31:58')
("{'x': 1255, 'y': 395}", '2017-01-19 13:31:58')
Not Terminated
("{'x': 1205, 'y': 399}", '2017-01-19 13:31:58')
("{'x': 961, 'y': 410}", '2017-01-19 13:31:58')
("{'x': 610, 'y': 407}", '2017-01-19 13:31:58')正如您所看到的,它正在打印“nothing”,这意味着它运行了10秒,到达了terminate命令,但是继续运行,就好像什么都没发生一样。你能告诉我我做错了什么吗?或者这是否与多重处理有关?
发布于 2017-01-20 00:27:30
您的代码有几个问题:
printevery100ms函数中有不同的缩进。printevery100ms()在您的if __name__ == '__main__': (第30行左右)之前被调用,并在主线程中运行函数,并且不会停止。multiprocessing.Process的调用调用参数为(10 )的printevery100ms,这将导致此调用失败。然而,您仍然有主线程运行,所以它似乎不会停止。以下是解决办法:
import multiprocessing
import time
import threading
import datetime
def printevery100ms():
threading.Timer(.1,printevery100ms).start()
ts = time.time()
st = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S')
from ctypes import windll,Structure,c_int,byref
class POINT(Structure):
_fields_ = [("x",c_int),("y",c_int)]
def queryMousePosition():
pt = POINT()
windll.user32.GetCursorPos(byref(pt))
return {"x": pt.x,"y": pt.y}
pos = queryMousePosition()
print('{{\'x\': {}, \'y\': {}}}'.format(pos['x'],pos['y']),st)
#printevery100ms() # HERES ISSUE NUMBER 2
if __name__ == '__main__':
# Start printevery100ms as a process
p = multiprocessing.Process(target=printevery100ms, name="printevery100ms", args=()) # FIXED ISSUE NUMBER 2
p.start()
# Wait 10 seconds for printevery100ms
time.sleep(10)
# Terminate printevery100ms
p.terminate()
p.join()
print("Not Terminated")https://stackoverflow.com/questions/41749556
复制相似问题