Python 父子進程的一個示範

Python 父子進程的一個示範

話說這原來是聽一個課程後的作業,需要運用父子進程的關係,來將一個檔案分解成兩個,前半部是父進程讀取寫入的,後半部是子進程讀取寫入的,寫著寫著當中添加了一些想法,後來覺得這個做出來的小程序似乎還不錯,程序中順便紀錄著其中的一些想法~ 一併跟大家分享下:

#!/usr/bin/env python3
__update__ = 'Fri 22 May, 2020  16:43'
import os
# 設定 <tab> 的功能; tab=complete 在 shell 模式下
# 可 list path
import readline, glob
def complete(text, state):
    return (glob.glob(text+'*')+[None])[state]
readline.set_completer_delims('\t\n;')    
readline.parse_and_bind('tab: complete')
readline.set_completer(complete)

def file_process(filename, xpid):
    def rw(outfile, fseek, bs):
        n = 0
        try:
            with open(filename, 'rb') as fr:
                if fseek > 0:
                    fr.seek(fseek)
                with open(outfile, 'wb') as fw:
                    print('>> 正在輸出文件名 >', outfile)
                    while n <= bs:
                        if (bs - n) < 64:
                            fw.write(fr.read(bs-n))
                            break
                        fw.write(fr.read(64))
                        n += 64
        except (IOError, KeyboardInterrupt, Exception) as e:
            print('[ERR#1]', e)
            return False
        else:
            return True

    if __name__ == '__main__':
        ppid, pid = xpid
        print('(PPID:CPID)=(%d:%d)' %(os.getpid(), os.getppid()))
        fn = os.path.basename(filename)
        # fpath = os.path.dirname(filename)
        fsize = os.stat(filename).st_size
        # 是否為父進程?
        if ppid == os.getpid():
            bs = (fsize // 2)
            fseek = 0
            outfile = 'parent_' + fn
        elif pid == os.getpid():
            bs = (fsize // 2)
            fseek = bs
            bs += (fsize % 2)
            outfile = 'child_' + fn

        return rw(outfile, fseek, bs)
# ===[ file_process() : End ]===

while True:
    filename = input('輸入要進行讀取的文件檔案:')
    if not os.path.isfile(filename):
        print('> [ERR] 此文件不存在!請輸入正確路徑!')
    else:
        break

pid = os.fork()
if pid < 0:
    print('進程創建失敗!')
elif pid == 0:
    print('子進程處理中...')
    print('子進程PID: %d /父進程PID: %d' %(os.getpid(), os.getppid()))
    print('-'*32)
    res = file_process(filename, (os.getppid(),os.getpid()) )
    print('='*32)
    if res:
        print('子進程完成工作交付。')
    else:
        print('子進程工作失敗!')
    os._exit(res)
else:
    # pid < 0
    try:
        # 表 等待任意子進程的退出, 非阻塞狀態
        pid, status = os.waitpid(-1, os.WNOHANG)
    except ChildProcessError:
        print('子進程已先退出了! 父進程準備退出...')
        sleep(10)   # 計畫 10 秒後退出
        os._exit(2)

    print('父進程處理中...')
    print('父進程PID: %d /子進程PID: %d' %(os.getpid(), pid))
    print('-'*32)
    res = file_process(filename, (os.getpid(),pid))
    print('='*32)
    if res:
        print('父進程完成工作交付。')
    else:
        print('父進程工作失敗!')

print('*** 正常退出 ***')         
os._exit(res)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中,可以使用`multiprocessing`模块来创建父子进程,并且通过进程间通信(IPC)来实现它们之间的通讯。下面是一个简单的示例: ```python from multiprocessing import Process, Pipe # 定义一个函数作为子进程的任务 def child_task(conn): # 子进程通过连接发送消息给父进程 conn.send("Hello from child process!") # 接收父进程发送的消息 message = conn.recv() print("Child process received:", message) # 关闭连接 conn.close() if __name__ == '__main__': # 创建一个管道,用于进程间通信 parent_conn, child_conn = Pipe() # 创建子进程,传入管道连接 child_process = Process(target=child_task, args=(child_conn,)) # 启动子进程 child_process.start() # 父进程通过连接接收子进程发送的消息 message = parent_conn.recv() print("Parent process received:", message) # 父进程通过连接发送消息给子进程 parent_conn.send("Hello from parent process!") # 等待子进程结束 child_process.join() ``` 在上面的示例中,我们使用`Pipe`函数创建了一个双向管道,然后将管道的一端传递给子进程。子进程通过连接发送消息给父进程,并且接收父进程发送的消息。父进程也可以通过连接接收子进程发送的消息,并且发送消息给子进程。最后,我们使用`join`方法等待子进程结束。 这只是一个简单的示例,实际上,Python中还有其他的进程间通信方式,如使用`Queue`、`Manager`等。你可以根据具体的需求选择适合的方式来实现进程间通信。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值