python多线程任务冲突,第1张

python多线程任务冲突,第2张

python下os.system使用shell脚本处理目录下的一些文件,shell分了几个步骤,用了多线程,当上个线程还未未处理完数据,下一个线程已经启动,同样处理了此文件,造成了一些冲突,

贴上这部分代码:
def save(fn, ts):
try:
print 'save', fn, '...', ts
s = os.path.basename(fn)
if s[-3:] == '.gz':
is_gz = True
s = s[:-3]
else:
is_gz = False
if s[:3] == 'dx.':
if is_gz:
dt = s.split('.')[4][:8]
p = DST_DIANXIN + dt + '/'
os.system('mkdir -p ' + p)
dx_fn = p + s + '.txt'
dx_tmp = p + s + '.new'
print 'zcat', fn, '-->', dx_fn
os.system('zcat %s > %s; mv -f %s %s; rm -rf %s' % (fn, dx_tmp, dx_tmp, dx_fn, fn))
# os.remove(fn)

while True:
if os.path.exists(SRC + 'stopping'):
break
rpts = glob.glob(SRC + '*.gz')
rpts.sort()
for fn in rpts:
fn2 = fn
if os.path.exists(fn2):
ts = len(threading.enumerate())
while ts > MAXTHREADS:
ts = len(threading.enumerate())
time.sleep(0.2)
threading.Timer(0.2, save, args=(fn2,ts)).start()
time.sleep(1) ----------------------- 以下是精选回复-----------------------

答:加锁。
答:只会最基本的mutex操作,每次打开一个文件就设置一个mutex=1,其他线程打开文件时就检测对应文件mutex是否为0,是就设置为1并打开操作,不是就sleep,然后再次查询。
答:也可以不用锁。

1,在启动其他线程前,记录一共有多少个文件,放在一个list里,比如有30个;
2, 将thread的名字设为有规律的,如thread-1, thread-2, thread-3;
3,thread-1处理前10个,thread-2处理中间10个,thread-3处理最后10个。
答:你贴成这样还指望有人去看你代码。
答:事实上,我也没看lz的代码。

其实可以用各种线程安全的queue,将所有文件组织成一个queue,比如threading.deque,然后每个线程都可以去pop/shift,这样也不用加锁。
答:Queue +1
任务队列,生产者消费者模式就挺好,保证不会乱的

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » python多线程任务冲突

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情