我在节点上创建了一个文件流,我担心文件访问,如果我从另一个节点启动流怎么办?
就像,在节点A上,我创建流而不启动它:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<!-- always start out matching the document root -->
<xsl:template match="/">
<xsl:apply-templates />
</xsl:template>
<!-- match the root element (not shown in your example) -->
<xsl:template match="root">
<xsl:element name="product">
<!-- apply templates in the desired order, specifically selecting matching 'data' elements -->
<xsl:apply-templates select="data[name/text() = 'id']" />
<xsl:apply-templates select="data[name/text() = 'att1']" />
<xsl:apply-templates select="data[name/text() = 'att2']" />
<xsl:apply-templates select="data[name/text() = 'status']" />
</xsl:element>
</xsl:template>
<xsl:template match="data">
<!-- choose the desired output element based on the current data/name text -->
<xsl:choose>
<xsl:when test="./name[text() = 'id']">
<xsl:element name="id">
<xsl:value-of select="./value" />
</xsl:element>
</xsl:when>
<xsl:when test="./name[text() = 'att1']">
<xsl:element name="color">
<xsl:value-of select="./value" />
</xsl:element>
</xsl:when>
<xsl:when test="./name[text() = 'att2']">
<xsl:element name="size">
<xsl:value-of select="./value" />
</xsl:element>
</xsl:when>
<xsl:when test="./name[text() = 'status']">
<xsl:element name="avail">
<xsl:value-of select="./value" />
</xsl:element>
</xsl:when>
<xsl:otherwise />
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
然后,在节点B上,我启动流:
xsl-foreach
流会按预期在节点A上查找文件吗?或者它会在节点B中查找它吗?(考虑节点B是流的起始位置),因为如果这样做会失败,因为该文件实际上存在于节点A上。
我应该关联存储文件的节点吗?我该怎么办?我需要吗?
有什么想法吗?
答案 0 :(得分:0)
File.stream!
返回File.Stream
结构,其中包含4个字段:path
,modes
,raw
和line_or_bytes
。该文件实际上仅在执行流时才打开,例如使用例如Stream.run/1
或任何Enum
功能。当您使用Agent
将该结构传递给另一个节点时,仅传递此4字段结构,如果您在该另一个节点上调用Stream.run
,该节点将尝试打开{指向的文件{1}}如果该节点的文件系统上没有文件,则会失败。因此,您的问题的答案是,除非文件存在于同一路径,否则操作将失败。
另一方面,Elixir中的文件句柄是PID,它在内部存储对打开的文件的引用。它们可以创建,例如使用path
。如果将此调用返回的PID传递给另一个节点,然后对其执行操作,例如在该节点上File.open!/1
(不是IO.read
),它将成功,因为操作作为消息发送到PID。如果文件句柄的PID来自另一个节点,则文件操作通过连接透明传输。因此,如果您想要访问这样的文件,可以使用File.read
,然后从另一个节点使用File.open!
。