<p><code>decSequenceToRNA</code>在它自己的进程中运行,这意味着它在主进程中获得每个数据结构的独立副本。这意味着当您在<code>decSequenceToRNA</code>中追加<code>_rnaSequences</code>时,它对父进程中的<code>rnaSequences</code>没有任何影响。这就解释了为什么返回一个空列表。在</p>
<p>你有两个选择来解决这个问题。首先,创建一个<a href="https://docs.python.org/2/library/multiprocessing.html#multiprocessing.managers.SyncManager.list" rel="nofollow">^{<cd5>}</a>,它可以使用<code>multiprocessing.Manager</code>在进程之间共享。例如:</p>
<pre><code>import multiprocessing
def f(shared_list):
shared_list.append(1)
if __name__ == "__main__":
normal_list = []
p = multiprocessing.Process(target=f, args=(normal_list,))
p.start()
p.join()
print(normal_list)
m = multiprocessing.Manager()
shared_list = m.list()
p = multiprocessing.Process(target=f, args=(shared_list,))
p.start()
p.join()
print(shared_list)
</code></pre>
<p>输出:</p>
^{pr2}$
<p>将此应用于代码只需替换</p>
<pre><code>rnaSequences = []
</code></pre>
<p>与</p>
<pre><code>m = multiprocessing.Manager()
rnaSequences = m.list()
</code></pre>
<p>或者,您可以(也可能应该)使用<a href="https://docs.python.org/2/library/multiprocessing.html#module-multiprocessing.pool" rel="nofollow">^{<cd7>}</a>,而不是为每个块创建单独的<code>Process</code>。我不确定<code>hFile</code>有多大,或者您正在读取的块有多大,但是如果有超过<a href="https://docs.python.org/2/library/multiprocessing.html#multiprocessing.cpu_count" rel="nofollow">^{<cd10>}</a>块,那么您将因为为每个块生成进程而损害性能。使用<code>Pool</code>,您可以保持进程计数不变,并轻松创建<code>rnaSequence</code>列表:</p>
<pre><code>def decSequenceToRNA(_idxSeq, _byteSequence):
rnaSequence = ''
printAndLog("!", "Processing block %d (%d bytes)" % (_idxSeq, len(_byteSequence)))
for b in _byteSequence:
rnaSequence = rnaSequence + base10ToRNA(ord(b))
printAndLog("+", "Block %d completed. RNA of %d nucleotides generated." % (_idxSeq, len(rnaSequence)))
return _idxSeq, rnaSequence
def fileToRNAString(_file):
rnaSequences = []
if (_file and os.path.isfile(_file)):
blockCount = 0
blockSize = 2048
printAndLog("!", "Converting %s into RNA string (%d bytes/block)" % (_file, blockSize))
results = []
p = multiprocessing.Pool() # Creates a pool of cpu_count() processes
with open(_file, "rb") as hFile:
buf = hFile.read(blockSize)
while buf:
result = pool.apply_async(decSequenceToRNA, blockCount, buf)
results.append(result)
blockCount = blockCount + 1
buf = hFile.read(blockSize)
rnaSequences = [r.get() for r in results]
pool.close()
pool.join()
else:
printAndLog("-", "Could not find the specified file. Please verify that the file exists:" + _file)
return rnaSequences
</code></pre>
<p>请注意,我们不再将<code>rnaSequences</code>列表传递给孩子。相反,我们只需将返回的结果返回给父对象(我们不能使用<code>Process</code>),并在那里构建列表。在</p>