gpt4 book ai didi

python - 如何使用 Python 中的线程模块写入命名管道?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:26:57 28 4
gpt4 key购买 nike

我正在尝试编写一个通过命名管道与外部程序通信的程序。 python 脚本不知道外部程序何时打开命名管道/文件进行读取,因此 python 脚本需要以阻塞模式打开管道,参见 open .如果python脚本以非阻塞方式打开,而外部程序还没有打开读取,open语句就会报错。

所以要以阻塞模式打开,python 脚本可以在单独的线程中打开命名管道,我已经尝试了线程模块。在下面的示例中,我只是从主线程中的命名管道读取数据,但它产生了相同的错误:

import threading
import os

pipe_name = 'pipe_test'


class WriterNamedPipe(threading.Thread):

def __init__(self, filepath, input):
'''
Write: generate that will output each line of input
'''
# Inherit
threading.Thread.__init__(self, verbose = True)
self.daemon = False
self.filepath = filepath
self.input = input
self.start()

def run(self):
# Open blockingly
with open(self.filepath, 'w') as f:
f.write(self.input)

if not os.path.exists(pipe_name):
os.mkfifo(pipe_name)

WriterNamedPipe(pipe_name, '1\n' * 100)

with open(pipe_name, 'r') as f:
print f.read()

这会导致挂起/卡住:

MainThread: <WriterNamedPipe(Thread-1, initial)>.start(): starting thread
Thread-1: <WriterNamedPipe(Thread-1, started 1078922160)>.__bootstrap(): thread started
Thread-1: <WriterNamedPipe(Thread-1, started 1078922160)>.__bootstrap(): normal return

Compilation hangup

但是,来自 here 的类似示例有效,但使用 os.fork:

import os, time, sys
pipe_name = 'pipe_test'

def child( ):
pipeout = os.open(pipe_name, os.O_WRONLY)
counter = 0
while True:
time.sleep(1)
os.write(pipeout, 'Number %03d\n' % counter)
counter = (counter+1) % 5

def parent( ):
pipein = open(pipe_name, 'r')
while True:
line = pipein.readline()[:-1]
print 'Parent %d got "%s" at %s' % (os.getpid(), line, time.time( ))

if not os.path.exists(pipe_name):
os.mkfifo(pipe_name)
pid = os.fork()
if pid != 0:
parent()
else:
child()

为什么有threading模块的例子挂了?

最佳答案

由于 GIL 这可能不起作用.线程中的open语句阻塞了整个程序。这可以通过使用 multiprocessing 来避免。模块代替。

关于python - 如何使用 Python 中的线程模块写入命名管道?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33254750/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com