首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我的Python代码在10秒后仍会继续运行?

为什么我的Python代码在10秒后仍会继续运行?
EN

Stack Overflow用户
提问于 2017-01-19 18:55:13
回答 1查看 1.2K关注 0票数 1

我有一个代码,打印出鼠标坐标( x,y)和时间戳100‘s。我想让它运行10秒,。就这样。

因此,我实现了"multiprocessing“,并初始化它,从多处理函数内部调用主函数"printevery100ms",并告诉它10秒后关闭。

但是它没有在10秒后关闭,而是跳过p.terminate()命令,继续运行和运行.

,这是代码.

代码语言:javascript
复制
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秒后..)

代码语言:javascript
复制
("{'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命令,但是继续运行,就好像什么都没发生一样。你能告诉我我做错了什么吗?或者这是否与多重处理有关?

EN

回答 1

Stack Overflow用户

发布于 2017-01-20 00:27:30

您的代码有几个问题:

  1. 从样式的角度来看,在printevery100ms函数中有不同的缩进。
  2. 我猜这就是问题所在:printevery100ms()在您的if __name__ == '__main__': (第30行左右)之前被调用,并在主线程中运行函数,并且不会停止。
  3. multiprocessing.Process的调用调用参数为(10 )的printevery100ms,这将导致此调用失败。然而,您仍然有主线程运行,所以它似乎不会停止。

以下是解决办法:

代码语言:javascript
复制
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")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41749556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档