Python:如何在网络中使用线程?

我正在尝试制作一个程序,该程序将搜索随机ID来查找网站标题。我做了一个单线程函数,但是它非常慢,因为如果没有随机IP的服务器,它必须等待超时。我不了解线程,有人可以帮助我吗?关于线程有什么好的教程吗?也许是一个有关如何使ips主线程和另外几个线程检查ips的示例。



慕妹3146593
浏览 193回答 3
3回答

慕慕森

我输入了一个非常简单的示例,希望它对您来说是一个很好的入门者:# 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

繁星点点滴滴

好的,所以基本上您想运行一个产生几个线程的脚本,每个线程都尝试到达一个IP,对吗?产生一个线程真的很容易:import threadingthread = threading.Thread(target=target_function, args(argument1, argument2,...))  thread.start()在这种情况下,target_function应该是您的ip检查功能。线程如何将其结果报告回主线程有几种方法。我猜想这应该是一个不会经常使用的简单脚本,所以为什么不简单地使用dict,将ips作为键,将结果作为值。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python