Mr.*_*ing 2 python selenium multithreading
使用 python,我并行启动两个子进程。一个是 HTTP 服务器,另一个是另一个程序的执行(CustomSimpleHTTPServer.py,这是一个由 selenium IDE 插件生成的 Python 脚本,用于打开 Firefox、导航到网站并进行一些交互)。另一方面,当第二个子进程完成执行时,我想停止执行第一个子进程(HTTP 服务器)。
我的代码的逻辑是 selenium 脚本会打开一个网站。该网站将自动对我的 HTTP 服务器进行几次 GET 调用。在 selenium 脚本执行完成后,应该关闭 HTTP 服务器,以便它可以将所有捕获的请求记录在一个文件中。
这是我的主要 Python 代码:
class Myclass(object):
HTTPSERVERPROCESS = ""
def startHTTPServer(self):
print "********HTTP Server started*********"
try:
self.HTTPSERVERPROCESS=subprocess.Popen('python CustomSimpleHTTPServer.py', \
shell=True, stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
except Exception as e:
print "Exception captured while starting HTTP Server process: %s\n" % e
def startNavigatingFromBrowser(self):
print "********Opening firefox to start navigation*********"
try:
process=subprocess.Popen('python navigationScript.py', \
shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
process.communicate()
process.wait()
except Exception as e:
print "Exception captured starting Browser Navigation process : %s\n" % e
try:
if process.returncode==0:
print "HTTPSERVEPROCESS value: %s" % self.HTTPSERVERPROCESS.returncode
print self.HTTPSERVERPROCESS
#self.HTTPSERVERPROCESS.kill()
#self.HTTPSERVERPROCESS.terminate()
#self.kill(self.HTTPSERVERPROCESS.pid)
except Exception as e:
print "Exception captured while killing HTTP Server process : %s\n" % e
def kill(self,proc_pid):
process = psutil.Process(proc_pid)
for proc in process.get_children(recursive=True):
proc.kill()
process.kill()
def startCapture(self):
print "********Starting Parallel execution of Server initiation and firefox navigation script*********"
t1 = threading.Thread(target=self.startHTTPServer())
t2 = threading.Thread(target=self.startNavigatingFromBrowser())
t1.start()
t2.start()
t2.join()
Run Code Online (Sandbox Code Playgroud)
注意:执行通过调用 startCapture() 开始
这是 CustomSimpleHTTPServer.py 的代码,它应该在终止时将捕获的请求写入 logfile.txt:
import SimpleHTTPServer
import SocketServer
PORT = 5555
class MyHTTPHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
log_file = open('logfile.txt', 'w')
def log_message(self, format, *args):
self.log_file.write("%s - - [%s] %s\n" %
(self.client_address[0],
self.log_date_time_string(),
format%args))
Handler = MyHTTPHandler
httpd = SocketServer.TCPServer(("", PORT), Handler)
httpd.serve_forever()
Run Code Online (Sandbox Code Playgroud)
当我使用 self.HTTPSERVERPROCESS.kill() 或 self.HTTPSERVERPROCESS.terminate() 或 os.kill() 时,我在运行主要 Python 代码时在终端中得到以下信息
********Starting Parallel execution of Server initiation and firefox navigation script*********
********SimpleHTTPServer started*********
********Opening firefox to start navigation*********
HTTPSERVEPROCESS value: <subprocess.Popen object at 0x1080f8410>
2459
Exception captured while killing HTTP Server process : [Errno 3] No such process
Process finished with exit code 0
Run Code Online (Sandbox Code Playgroud)
当我使用 self.kill(self.HTTPSERVERPROCESS.pid) 时,我在运行主要 Python 代码时在终端中得到关注
********Starting Parallel execution of Server initiation and firefox navigation script*********
********SimpleHTTPServer started*********
********Opening firefox to start navigation*********
HTTPSERVEPROCESS value: <subprocess.Popen object at 0x1080f8410>
2459
Exception captured while killing HTTP Server process : 'Process' object has no attribute 'get_children'
Process finished with exit code 0
Run Code Online (Sandbox Code Playgroud)
以下三个都不能杀死 HTTPServer 进程:
self.HTTPSERVERPROCESS.kill()
self.HTTPSERVERPROCESS.terminate()
self.kill(self.HTTPSERVERPROCESS.pid)
Run Code Online (Sandbox Code Playgroud)
我知道 CustomSimpleHTTPServer.py 是正确的,因为当我单独运行它并手动浏览到网站,然后通过在终端中按 CTRL-c 手动终止 CustomSimpleHTTPServer.py 脚本时,日志会填充在 logfle.txt 中。
我要对我的代码进行哪些更改才能使其正常工作并填充日志?
您应该只用于os.kill()向进程发送信号:
import os
import signal
...
os.kill(the_pid, signal.SIGTERM) # usually kills processes
os.kill(the_pid, signal.SIGKILL) # should always kill a process
Run Code Online (Sandbox Code Playgroud)
此外,如果您杀死父进程,它通常也会杀死子进程。
更新:
我对 Server 程序做了两个小改动:
self.log_file.flush()确保将日志条目刷新到日志文件中。allow_reuse_address以便您可以在终止服务器后不久重新使用相同的地址。(见这个问题)文件Server:
#!/usr/bin/env python
import SimpleHTTPServer
import SocketServer
PORT = 5555
class MyServer(SocketServer.TCPServer):
allow_reuse_address = True
class MyHTTPHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
log_file = open('logfile.txt', 'w')
def log_message(self, format, *args):
self.log_file.write("%s - - [%s] %s\n" %
(self.client_address[0],
self.log_date_time_string(),
format%args))
self.log_file.flush()
Handler = MyHTTPHandler
httpd = MyServer(("", PORT), Handler)
httpd.serve_forever()
Run Code Online (Sandbox Code Playgroud)
这是一个简单的导航程序(文件Navigate):
#!/usr/bin/env python
import requests
import time
URL = "http://localhost:5555/"
def main():
for x in range(5):
print "x =", x
r = requests.get(URL + "asd")
time.sleep(1)
print "Quitting"
main()
Run Code Online (Sandbox Code Playgroud)
这是主程序:
#!/usr/bin/env python
import os
import subprocess
import signal
def main():
# start web server
web = subprocess.Popen(["./Server"])
print "web server pid:", web.pid
# start navigator
nav = subprocess.Popen(["./Navigate"])
print "nav pid: ", nav.pid
# wait for nav to exit
nav.wait()
print "done waiting for nav"
print "killing web server"
os.kill(web.pid, signal.SIGTERM )
web.wait()
print "server terminated"
main()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4573 次 |
| 最近记录: |