我正在尝试制作一个程序来搜索站点标题的随机 id。我做了一个单线程函数,但它非常慢,因为如果没有随机 ip 的服务器,它必须等待超时。我对线程一无所知,有人可以帮助我吗?有什么好的线程教程吗?或者也许是一个关于如何拥有一个 ips 主线程和另外几个线程检查 ips 的示例。
任何帮助表示赞赏。谢谢
我正在尝试制作一个程序来搜索站点标题的随机 id。我做了一个单线程函数,但它非常慢,因为如果没有随机 ip 的服务器,它必须等待超时。我对线程一无所知,有人可以帮助我吗?有什么好的线程教程吗?或者也许是一个关于如何拥有一个 ips 主线程和另外几个线程检查 ips 的示例。
任何帮助表示赞赏。谢谢
好的,所以基本上你想运行一个脚本来产生几个线程,每个线程都试图到达一个 ip 对吗?
产生一个线程真的很容易:
import threading
thread = threading.Thread(target=target_function, args(argument1, argument2,...))
thread.start()
在这种情况下, target_function 应该是您的 ip 检查功能。
线程如何将其结果报告回主线程有几种方法。我猜这应该是一个不会经常使用的简单脚本,所以为什么不简单地使用一个字典,你使用 ips 作为键,结果作为值。
我打了一个非常简单的例子,希望它对你来说是一个很好的开始:
# this is important
from thread import start_new_thread, allocate_lock
# this is for show
from time import sleep
from random import randint
# global receiver
myresults = []
counter = 0
# lock that protects "myresults"
lock = allocate_lock()
#lock that protects "counter"
lock2 = allocate_lock()
# this does the url processing
def retrieve(url):
# sleep for 4-10s to simulate processing time
sleep(randint(4,10))
print "Done handling %s" % url
# thread safe retrieve
def 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 loop
start_new_thread(retrieve, ("A",))
start_new_thread(retrieve, ("B",))
start_new_thread(retrieve, ("C",))
# using locking
start_new_thread(retrieveLocking, ("A",))
start_new_thread(retrieveLocking, ("B",))
start_new_thread(retrieveLocking, ("C",))
在这种情况下,可以通过全局变量来处理查询结果。有更复杂的方法可以从线程中检索数据。
如果您使用全局变量解决方案,我添加了锁。在并发编程中,当多个线程想要同时访问同一个资源时,可能会出现“竞争条件”。为了防止覆盖这些变量的旧状态,锁可以保护该资源。只有在锁被释放后,才允许下一个线程访问该资源。等待发布在这里为您处理 :)
我希望这有帮助 :)
// 编辑:如果你以这种方式解决你的问题,实际上并没有办法确定是否所有线程都终止了。因此,如果您想坚持这个解决方案,请添加一个由每个线程增加的计数器(用锁保护计数器)并执行忙等待(无限循环,直到达到计数器)。这真是不好的做法。但是,如果您想更精细地编写代码,事情会变得有点复杂,我假设您是并发编程的新手:
while True:
lock2.acquire()
if counter == totalthreads: # in this case 3
lock2.release()
break
lock2.release()
print "Done! %r" % myresults