python queue中 task_done()和join()问题 代码如下

consumer.run if data == 2 的else分支少了 self.q.task_done()。加上就正常了。

#!/usr/bin/envpython3
#coding=utf-8

"""
mole/programdocument
"""

fromqueueimportQueue
fromthreadingimportThread


classprocer(Thread):
def__init__(self,q):
super().__init__()
self.q=q

defrun(self):
self.count=5
whileself.count>0:
ifself.count==1:
self.count-=1
self.q.put(2)
else:
self.count-=1
self.q.put(1)


classconsumer(Thread):

def__init__(self,q):
super().__init__()
self.q=q

defrun(self):
whileTrue:
data=self.q.get()
ifdata==2:
print("stopbecausedata=",data)
self.q.task_done()
break
else:
print("dataisgood,data=",data)
self.q.task_done()


defmain():
qq=Queue()
p=procer(qq)
c=consumer(qq)
p.setDaemon(True)
c.setDaemon(True)
p.start()
c.start()
qq.join()
print("queueiscomplete")


if__name__=='__main__':
main()

㈡ 求python中join和split的详解

string.split() 以后的返回值就是一个由几个string构成的list也就是由string构成的数组,
b = a.split()得到 b = ['i','love','python'] ,
'*'.join(b)是string '*' 的方法而不是list的方法。

㈢ Python中threading的join和setDaemon的区别及用法

上海蓝盟为你解答:

Python多线程编程时,经常会用到join()和setDaemon()方法,今天特地研究了一下两者的区别。

1、join ()方法:主线程A中,创建了子线程B,并且在主线程A中调用了B.join(),那么,主线程A会在调用的地方等待,直到子线程B完成操作后,才可以接着往下执行,那么在调用这个线程时可以使用被调用线程的join方法。

原型:join([timeout]) 里面的参数时可选的,代表线程运行的最大时间,即如果超过这个时间,不管这个此线程有没有执行完毕都会被回收,然后主线程或函数都会接着执行的。
例子:

[python] view plain
import threading
import time
class MyThread(threading.Thread):
def __init__(self,id):
threading.Thread.__init__(self)
self.id = id
def run(self):
x = 0
time.sleep(10)
print self.id

if __name__ == "__main__":
t1=MyThread(999)
t1.start()
for i in range(5):
print i
执行后的结果是:

[python] view plain
0
1
2
3
4
999
机器上运行时,4和999之间,有明显的停顿。解释:线程t1 start后,主线程并没有等线程t1运行结束后再执行,而是先把5次循环打印执行完毕(打印到4),然后sleep(10)后,线程t1把传进去的999才打印出来。
现在,我们把join()方法加进去(其他代码不变),看看有什么不一样,例子:

[python] view plain
import threading
import time
class MyThread(threading.Thread):
def __init__(self,id):
threading.Thread.__init__(self)
self.id = id
def run(self):
x = 0
time.sleep(10)
print self.id

if __name__ == "__main__":
t1=MyThread(999)
t1.start()
t1.join()
for i in range(5):
print i
执行后的结果是:

[python] view plain
999
0
1
2
3
4
机器上运行时,999之前,有明显的停顿。解释:线程t1 start后,主线程停在了join()方法处,等sleep(10)后,线程t1操作结束被join,接着,主线程继续循环打印。

2、setDaemon()方法。主线程A中,创建了子线程B,并且在主线程A中调用了B.setDaemon(),这个的意思是,把主线程A设置为守护线程,这时候,要是主线程A执行结束了,就不管子线程B是否完成,一并和主线程A退出.这就是setDaemon方法的含义,这基本和join是相反的。此外,还有个要特别注意的:必须在start() 方法调用之前设置,如果不设置为守护线程,程序会被无限挂起。

例子:就是设置子线程随主线程的结束而结束:

[python] view plain
import threading
import time
class MyThread(threading.Thread):
def __init__(self,id):
threading.Thread.__init__(self)
def run(self):
time.sleep(5)
print "This is " + self.getName()

if __name__ == "__main__":
t1=MyThread(999)
t1.setDaemon(True)
t1.start()
print "I am the father thread."

执行后的结果是:

[python] view plain
I am the father thread.

可以看出,子线程t1中的内容并未打出。解释:t1.setDaemon(True)的操作,将父线程设置为了守护线程。根据setDaemon()方法的含义,父线程打印内容后便结束了,不管子线程是否执行完毕了。

程序运行中,执行一个主线程,如果主线程又创建一个子线程,主线程和子线程就分兵两路,分别运行,那么当主线程完成想退出时,会检验子线程是否完成。如果子线程未完成,则主线程会等待子线程完成后再退出。但是有时候我们需要的是,只要主线程完成了,不管子线程是否完成,都要和主线程一起退出,这时就可以用setDaemon方法了。
所以,join和setDaemon的区别如上述的例子,它们基本是相反的。

㈣ python join的问题

join是string类型的一个函数,用调用他的字符串去连接参数里的列表
‘,'.join调用者是',',python里面万物皆对象,','是一个string类型的对象,调用join函数,将后面的列表里的值用逗号连接成新的字符串;
str(i) for i in list 这是一个映射,就是把list中每个值都转换成字符串。
如果你要str(i) for i in list的结果是['1', '2', '3', '4', '5', '6', '7']

㈤ Python的join方式和+拼接字符串效率差多少

join()方法使用指定的字符串作为连接符对序列中的多个字符串进行连接。需要计算每个字符串的位置,比较慢
+操作是连接原始字符串的利器,效率是最高的。

㈥ 一般python中的os.path.join()什么时候会用到呢

是在拼接路径的时候用的。举个例子,
os.path.join(“home”, "me", "mywork")
在Linux系统上会返版回
“home/me/mywork"
在Windows系统上会返回
"home\me\mywork"
好处是可权以根据系统自动选择正确的路径分隔符"/"或"\"

㈦ Python里 print("".join([d.get(c,c) for c in s])) 这句是什么意思

print("".join([d.get(c,c) for c in s]))

首先是一个循环for c in s,这个就是变量输入的字符串;

然后d.get(c,c) for c in s,对于每一个c,从内d里面获取对应的容value

最后"".join把上面的结果拼接成一个字符串。

等价于下面代码:

tmp=[]
forcins:
tmp.append(d.get(c,c))
print"".join(tmp)

㈧ python join怎么使用

就是把一个list中所有的串按照你定义的分隔符连接起来,比如: list = ['a','b','c'] sep = '|' join(list,sep)的结果就是a|b|c

㈨ python 列表怎么调用join

具体作用如下:
join(): 连接字符串数组。将字符串、元组、列表中的元素以指定的字符(分隔符)连接生成一个新的字符串
os.path.join(): 将多个路径组合后返回

㈩ 怎么用python string join

>>> A=[['A','B'],['a','b']]
>>> A=[''.join(s) for s in A]
>>> A
['AB', 'ab']