键盘控制线程开启和暂停

Posted zwnsyw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了键盘控制线程开启和暂停相关的知识,希望对你有一定的参考价值。

from pynput import keyboard
from multiprocessing import Process
import multiprocessing, psutil


def run(index):
    # index = 1
    while True:
        index += 1
        print(\'进程在运行!\', index)


def listen_1():
    with keyboard.Listener(on_press=on_press,
                           on_release=None) as (listener):
        listener.join()


def on_press(key):
    global pid
    try:
        if str(key) == \'Key.end\':
            pause = psutil.Process(pid)
            pause.suspend()
            print(\'暂停运行\')

        if str(key) == \'Key.home\':
            pause = psutil.Process(pid)
            pause.resume()
            print(\'恢复运行\')
    except AttributeError:
        print(\'\', end=\'\')


if __name__ == \'__main__\':
    multiprocessing.freeze_support()
    p = Process(target=run, args=(100000000000000000000,))
    p.start()
    pid = p.pid
    listen_1()

 

10_控制线程_线程让步yield

【线程让步yield()方法】

yield()方法可以让当前正在执行的线程暂停,但它不会阻塞该线程,它只是将该线程从运行状态转入就绪状态

只是让当前的线程暂停一下,让系统的线程调度器重新调度一次。

很有可能,当某个线程调用了yield()方法暂停之后进入就绪状态,它又马上抢占了CPU的执行权,继续执行。

 

【注意】

实际上,当某个线程调用了yield()方法暂停之后,只有优先级与当前线程相同,或者优先级比当前线程更高的处于就绪状态的线程才会获得执行的机会。

 

【示例代码】

package com.Higgin.part02;

class YieldThread implements Runnable{
    
    public void run() {
        for(int i=0;i<100;i++){
            
            if(i==20){
                //当i==20的时候,使用yield方法使当前线程让步
                Thread.yield();
            }
            System.out.println(Thread.currentThread().getName()+"===="+i);
        }
    };
}

public class Demo03 {
    public static void main(String[] args) {
        YieldThread yt=new YieldThread();
        Thread t1=new Thread(yt,"高级");
        t1.setPriority(Thread.MAX_PRIORITY);  //将t1线程设置成最高优先级
        
        Thread t2=new Thread(yt,"低级");
        t2.setPriority(Thread.MIN_PRIORITY);  //将t2线程设置成最低优先级
        
        t2.start();
        t1.start();
        
    }
}

【运行结果】

 

【注意】

在多CPU执行的情况下,效果可能会不明显。

 

【小结:关于sleep和yield的区别】

1.sleep()方法暂停当前线程后,会给其他线程执行机会,线程优先级对此没有影响。

yield()方法会给优先级相同或更高的线程更高的执行机会。

 

2.sleep()方法会将线程转入阻塞状态,直到阻塞时间结束,才会转入就绪状态。

yield()方法会将当前线程直接转入就绪状态。

 

3.sleep()方法声明抛出了InterruptedException异常,所以调用sleep()方法时要么捕捉该异常,要么显示声明抛出该异常。

yield()方法则没有声明抛出任何异常。

 

4.sleep()方法比yield()方法有更好的移植性,通常不建议使用yield()方法来控制并发线程的执行。

 

【设置线程的优先级】

Thread了提供了以下两个优先级相关方法:

1.setPriority( int newPriority ) :设置线程的优先级

2.getPriority( ):获取线程的优先级

默认情况下,main主线程默认为NORM_PRIORITY普通优先级,其值为5。

 

以上是关于键盘控制线程开启和暂停的主要内容,如果未能解决你的问题,请参考以下文章

Python3编程实战Tetris机器人(游戏暂停)

win7系统开启键盘鼠标键来控制鼠标怎么设置

让我的 Cocoa 应用程序响应键盘播放/暂停键?

10_控制线程_线程让步yield

Chrome 开发者工具中的“暂停动画”功能是不是有键盘快捷键? (F12)

C#中关于Thread.sleep(1000)的问题!!