【发布时间】:2016-10-06 14:41:24
【问题描述】:
我正在寻找一种允许并发文件对象查找的方法。
作为文件搜索谨慎的测试用例:
#!/usr/bin/env python2
import time, random, os
s = 'The quick brown fox jumps over the lazy dog'
# create some file, just for testing
f = open('file.txt', 'w')
f.write(s)
f.close()
# the actual code...
f = open('file.txt', 'rb')
def fn():
out = ''
for i in xrange(10):
k = random.randint(0, len(s)-1)
f.seek(k)
time.sleep(random.randint(1, 4)/10.)
out += s[k] + ' ' + f.read(1) + '\n'
return out
import multiprocessing
p = multiprocessing.Pool()
n = 3
res = [p.apply_async(fn) for _ in xrange(n)]
for r in res:
print r.get()
f.close()
我有工作进程,它们在文件中进行随机搜索,然后是 sleep,然后是 read。我将read 与实际的字符串字符进行比较。我不会立即打印以避免打印的并发问题。
可以看到n=1时一切顺利,但n>1时由于文件描述符中的并发性,一切都误入歧途。
我试图在fn() 中复制文件描述符:
def fn():
fd = os.dup(f)
f2 = os.fdopen(fd)
然后我使用f2。但这似乎没有帮助。
如何同时进行搜索,即从多个进程中进行搜索? (在这种情况下,我可以只 open fn() 中的文件,但这是一个 MWE。在我的实际情况下,这样做更难。)
【问题讨论】:
标签: python concurrency