进程立即关闭

时间:2019-05-31 20:45:13

标签: python multiprocessing pynput

我正在尝试设置2个进程,一个进程执行一个功能,另一个进程用pynput监视键盘。他们需要进行通信以彼此关闭:功能关闭后,监视功能将关闭;用户按下特定键时,监视功能将关闭。

但是,似乎我的监视过程立即关闭并且没有收听,并且我不知道为什么。

我尝试在两个进程中添加打印功能,并且它们都起作用,所以我知道它们确实会触发,但是在执行一个功能期间,我似乎无法保持failsafe的生命。

有关该程序的更多详细信息: 我的目标是拥有一个safefunc函数,该函数接受一个参数和三个pynput键。 safefunc在一个进程中在arg中运行该功能,而在另一进程中启动键盘的pynput键盘监听器。侦听器检测到3个键,一个键暂停该功能的过程,一个键恢复该功能,另一个键停止该功能。 功能过程也应在监听过程结束时停止监听。

主文件:

import multiprocessing
from multiprocessing import Process, Pipe
import pynput
from pynput.keyboard import Listener  as KeyboardListener
from pynput.keyboard import Key
import psutil
import mybunchoffunc
import time

def safefunc(function,play,pause,stop): # arg of type <enum 'Key'>
    parent_conn, child_conn = Pipe()
    processfailsafe = multiprocessing.Process(target = mybunchoffunc.failsafefunc, args = (play,pause,stop,child_conn))
    processfunction = multiprocessing.Process(target = mybunchoffunc.funcfunc, args = (function,parent_conn))
    processfailsafe.start()
    processfunction.start()
    processfunction.join()

safefunc(mybunchoffunc.testing,'I','O','P')

mybunchoffunc.py文件:

import pynput
from pynput.keyboard import Listener  as KeyboardListener
from pynput.keyboard import Key
from multiprocessing import Process, Pipe
import psutil
import time

def failsafefunc(play,pause,stop,conn):
    funcpid = conn.recv()
    failpid = psutil.Process().pid
    conn.send(failpid)
    funcproc = psutil.Process(funcpid)
    def player(key):
        if key == play:
            funcproc.resume()
        if key == pause:
            funcproc.suspend()
        if key == stop:
            funcproc.terminate()
            return False
    keyboardlistener = KeyboardListener(on_press=player)
    keyboardlistener.start()

def funcfunc(function,conn):
    current_process_pid = psutil.Process().pid
    conn.send(current_process_pid)
    function()
    failpid = conn.recv()
    failproc = psutil.Process(failpid)
    failproc.terminate()

def testing():
    for i in range(10):
        print("going there "+str(i))
        print([p.info for p in psutil.process_iter(attrs=['pid', 'name']) if 'python' in p.info['name']])
        time.sleep(2)

一些事情可以理解这段代码中发生的事情:

  • 3周前,我开始学习python(和编程),对您来说,代码可能看起来很糟糕

  • 我使用的是进程而不是线程,因此我可以使用psutil函数resume(),suspend()和Terminate()

  • 我使用2个不同的文件,因为如果Windows上运行的功能与它们位于同一个文件中,则Windows上的进程将不会启动(请花点时间来理解它)

在执行此代码时,process函数会正常运行,然后在尝试关闭侦听进程时会出现一条错误消息,因为它已经死了(NoSuchProcess: psutil.NoSuchProcess no process found with pid 16880)。我不知道为什么聆听过程无法持续进行。

0 个答案:

没有答案