V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
chunhai
V2EX  ›  Python

Python 程序后台运行,如何写在控制台与他交互啊。怎么自定义命令

  •  
  •   chunhai · 2022-09-07 01:49:38 +08:00 · 2097 次点击
    这是一个创建于 844 天前的主题,其中的信息可能已经有所发展或是发生改变。

    写一个定时程序,线程始终后台执行。然后通过控制台或者 cmd 输入命令,添加新的定时任务。 这类的 python 程序都是通过什么写的啊

    请教以下各位大佬。

    15 条回复    2022-09-08 15:24:25 +08:00
    ccdjh
        1
    ccdjh  
       2022-09-07 02:59:52 +08:00
    你是需要这个?

    https://python-rq.org/
    LeeReamond
        2
    LeeReamond  
       2022-09-07 07:50:51 +08:00
    很简单,原教旨主义的程序是面向过程的,也就是逐条执行指令。你想要在这个基础上加上外部互动的功能,那你就需要额外再写一个能接收输入输出的过程,它可以以单独的一个线程或进程的形式存在。
    lawsiki
        3
    lawsiki  
       2022-09-07 10:41:15 +08:00
    用一个文件或数据库保存任务配置就行了,A 定时读取配置执行,B 添加任务的时候往配置写
    chunhai
        4
    chunhai  
    OP
       2022-09-07 11:32:21 +08:00
    @lawsiki 定时读取感觉这样写法有点奇怪增大了开销啊,而且添加这样做,删除和修改有点麻烦了啊。
    我想实现像 docker 那样 通过 docker run 这样启动容器的方式该怎么写呢?
    chunhai
        5
    chunhai  
    OP
       2022-09-07 11:34:38 +08:00
    @LeeReamond 这个过程的接收输入通过什么实现的啊
    renmu
        6
    renmu  
       2022-09-07 11:48:41 +08:00 via Android
    一个进程轮询执行,一个进程接收数据
    julyclyde
        7
    julyclyde  
       2022-09-07 11:56:06 +08:00
    @chunhai 开个网络监听
    julyclyde
        8
    julyclyde  
       2022-09-07 11:56:43 +08:00
    @lawsiki 修改配置文件显然是个不靠谱的做法
    如果程序读取的时候正在编辑怎么办
    lawsiki
        9
    lawsiki  
       2022-09-07 14:09:23 +08:00
    @julyclyde 通过程序去添加修改,不是人工编辑文本,像 crontab ,青龙面板这些的底层逻辑不就是这样么?
    LindsayZhou
        10
    LindsayZhou  
       2022-09-07 16:20:28 +08:00
    配置文件,不是定时读取,用 inotify 监听文件变化,Python 有 SDK 的。
    如果不希望加 inotify 依赖的话,Python 监听 HUP 信号,收到时重载配置。手动重载用 `kill -HUP [$pid]`。如果用 systemd 管理,加一行 `ExecReload=/bin/kill -HUP $MAINPID`。
    以上都在说 Linux ,Windows 的话,我就不清楚了,我不太会用 Windows.
    LindsayZhou
        11
    LindsayZhou  
       2022-09-07 16:28:50 +08:00
    # 10
    以上说用配置文件是比较简便的方法,如果要比较复杂的交互,还是按楼上的说法开个线程接收数据,asyncio 开个 Task 什么的。
    docker 默认是用的 Unix Socket 通信,也可以开 http 。
    julyclyde
        12
    julyclyde  
       2022-09-07 16:30:14 +08:00
    @lawsiki crontab 的编辑是另外进行的,然后覆盖到正式的文件名上; crond 每分钟发现一次文件是否变动;
    其他服务器一般都是单独发信号通知重新加载配置文件的

    你不能只看某些面板做到了这功能而不深究其原理啊
    再说了,你的程序如果运行出毛病了,那些面板会为你负责么
    ClericPy
        13
    ClericPy  
       2022-09-07 21:11:05 +08:00
    IPC 的手段很多啊, 你说的 sys.stdin 一般就够了

    复杂点的最近用了下 Unix domain socket, 那高并发杠杠的, 尤其是底层 asyncio 都包好了变成 Stream 的 Reader 和 Writer, 写啥都跟写 Pipe 一样.

    或者你监控一个文件夹里出现新的 py 文件就导入它?

    或者开个 HTTP

    反正思路很多看你愿意怎么玩了, 不过看你的意思感情就是个随时拔插的一个 systemd / supervisor 啊... 那还不如丢一堆 alias 在 tmux 里随便折腾呢
    julyclyde
        14
    julyclyde  
       2022-09-08 10:11:46 +08:00
    @ClericPy 出现一个新的就导入,需要有本地文件系统的权限才能注入新任务,这要求是不是太高了?
    而且只能插不能拔
    rev1si0n
        15
    rev1si0n  
       2022-09-08 15:24:25 +08:00
    xml/jsonrpc
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1063 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 19:00 · PVG 03:00 · LAX 11:00 · JFK 14:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.