假设我有这样的代码:
def func1(a,b,c):
try:
p = pycurl.Curl()
p.setopt(pycurl.PROXY, "127.0.0.1")
p.setopt(pycurl.PROXYPORT, 9050)
p.setopt(pycurl.PROXYTYPE, pycurl.PROXYTYPE_SOCKS5)
p.perform()
p.close()
except pycurl.error as error:
if error[0] == 28: # timeout - change proxy
print "Tor timeout, need to change"
queue.put((a,b,c))
new_tor()
return
def new_tor():
# send_signal_for_new_ident_is_here
我在7个帖子中启动此代码 当线程收到错误28时,它会更改标识。 但它发生了所有7个线程发送信号以改变识别。
如何做到这一点:
如果线程收到错误28,那么它调用new_tor()而其他6个线程不会等待结果,然后才会继续工作。如何同步?
答案 0 :(得分:0)
只是输入错误" id"进入队列,如果遇到它,将值放回队列,然后根据需要进行处理。
你不想结束这个话题,这就是我所做的 因此,您可以为每个线程提供一些唯一标识符,这样,如果一个线程遇到错误,它还会添加数据(它的标识符),表明它之前遇到过此错误,因此如果遇到所有线程此错误,错误将从队列中删除。
代码:
import threading
import Queue
y = 0
def f1():
global y
y += 1
if y > 100:
raise ValueError('trial')
def f2():
return
class Test(threading.Thread):
def __init__(self, func, name):
threading.Thread.__init__(self)
self.func = func
self.name = name
def run(self):
while True:
x = ''
if not queue.empty():
x = queue.get()
if x == 'error':
queue.put(x)
print 'Stopping %s' % (self.name,)
return
try:
self.func()
except Exception as e:
queue.put('error')
queue = Queue.Queue()
thread1 = Test(f1, '1')
thread2 = Test(f2, '2')
thread1.start()
thread2.start()