慕慕森
我输入了一个非常简单的示例,希望它对您来说是一个很好的入门者:# this is importantfrom thread import start_new_thread, allocate_lock# this is for showfrom time import sleepfrom random import randint# global receivermyresults = []counter = 0# lock that protects "myresults"lock = allocate_lock()#lock that protects "counter"lock2 = allocate_lock()# this does the url processingdef retrieve(url): # sleep for 4-10s to simulate processing time sleep(randint(4,10)) print "Done handling %s" % url# thread safe retrievedef retrieveLocking(url): // global variables global myresults, counter // random processing time sleep(randint(4,10)) print "[LOCKING] Done handling %s" % url // request access to myresults' lock lock.acquire() myresults.append(url) lock.release() // release lock! // request access to counter's lock lock2.acquire() counter += 1 lock2.release() // release lock!# here goes your main loopstart_new_thread(retrieve, ("A",))start_new_thread(retrieve, ("B",))start_new_thread(retrieve, ("C",))# using lockingstart_new_thread(retrieveLocking, ("A",))start_new_thread(retrieveLocking, ("B",))start_new_thread(retrieveLocking, ("C",))在这种情况下,可以通过全局变量来处理查询结果。有更多复杂的方法可以从线程tho'中检索数据。如果您使用全局变量解决方案,则添加了锁。在并发编程中,当多个线程希望同时访问同一资源时,可能会发生“竞赛条件”。为了防止覆盖这些变量的旧状态,锁可以保护该资源。仅在释放锁定之后,才允许下一个线程访问资源。等待发布会在这里为您服务:)我希望这有帮助 :)//编辑:如果您以这种方式解决问题,实际上并没有确定所有线程是否终止的方法。因此,如果您要坚持使用此解决方案,请添加一个由每个线程增加的计数器(用锁保护计数器)并进行繁忙等待(无限循环,直到到达计数器)。这确实是不好的做法。但是,如果您想更详细地编写代码,事情会变得有些复杂,我认为您是并发编程的新手:while True: lock2.acquire() if counter == totalthreads: # in this case 3 lock2.release() break lock2.release()print "Done! %r" % myresults