【问题标题】:Threading in Python and Queuing [duplicate]Python中的线程和队列[重复]
【发布时间】:2014-06-10 04:55:25
【问题描述】:

我是线程和队列的新手。下面的函数只接受一个字符串并返回一个截断字符列表ex: 789 it returns ['789','89','9']。但我得到了奇怪的输出。

def do_stuff(q):

    while True:
        x=str(q.get())
        print [x[i:]for i in range(len(x))]   
        q.task_done()

q = Queue(maxsize=0)
num_threads = 10

for i in range(num_threads):
  worker = threading.Thread(target=do_stuff, args=(q,))
  worker.setDaemon(True)
  worker.start()

for x in xrange(10,100000):
  q.put(x)

q.join()

我的输出:

 ['10', ['0''1]1'[
    , '12''1', ]'2'
     ][
    '13'[, '1'43''[, ]'15''4'
    , ]['5'
    '16'], 
    '6' ][[
    '17''18', , '7''8'[]]'19'

    , '9']
    ['20'[, '21''0'[, ]'22''1'
    , ]['2'
    '23' ], [
    '3''24'][, 
    '25''4'[, ]'26''5'
    , ]['6'
    '27'][, 
    '28''7', ]'8'
     ][
    '29', '9']
    ['30', '0']
     [['31''32', , '1'['2']'33']
     , 
    ['3''34'], 
     '4'[]'35'
     , [['5''36''37'], , 
    '6''7'][]
    '38'
    , '8'[]'39
    ', '9']
    ['40'[, '41''0', ]'1'
     ][
    '42'[, '43''2'[, ]'44''3'
    , ]'4'
    ]['45'
    , '5'[]'46'
    , '6'[]'47'
    , '7'][
    '48', '8']
     ['49', '9']
    ['50'[, '51''0'[, ]'52''1'
    , ]'2'
    ]
     ['53', ['3''54'], 
     '4'[[]'55''56'
    , , '5''6'][]
    '57
    ', '7'] ..... so on

但预期的输出:

['10','0']
['11','1']
['12','1'] so on

为什么要覆盖队列?

【问题讨论】:

  • 看起来您的线程在写入标准输出时只是相互踩踏。如果您在 print 语句周围加锁,我认为您会发现输出更接近您的预期。
  • @dano 你能指导我如何把锁..我是线程新手
  • @sundarnatarajサンダーナタラジ:它提供了答案,以及指向另一个问题的链接,并进行了更多讨论。

标签: python multithreading


【解决方案1】:

Dano 所说的问题是线程覆盖了队列。为了解决它,我搜索了锁。我找到了路

queueLock = threading.Lock()

def do_stuff(q):
    print threading.current_thread()
    while True:
        queueLock.acquire()
        x=str(q.get())
        print [x[i:]for i in range(len(x))]
        queueLock.release()    
        q.task_done()

现在输出是

['10', '0']
['11', '1']
['12', '2']
['13', '3']
['14', '4']...

感谢达诺

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-18
    • 1970-01-01
    相关资源
    最近更新 更多