1. 程式人生 > >阿里第二次電面

阿里第二次電面

1. 垃圾回收機制

2.死鎖

3.跟ipv6相關的技術

4. 專案裡面是怎麼讀取到郵件的?用了哪些庫?

5.職業規劃

6.tcp如何建立連線

7.指標

8.java 和python各自的優點

9.yeiled的使用

Java死鎖:程序迴圈等待它方佔有的資源而無限制的僵持下去的局面。

      同步程式碼塊中都去爭奪同一資源,互不相讓。舉個例子,在一條東西方向的狹窄的巷道中,AB兩車相遇,互補退讓,結果是兩個車都走不了,這就是死鎖。這裡隱含了一個情景就是,A車佔有東邊這一段道路,它需要B車讓出B車佔有西邊的道路,而同時B車佔有西邊的道路,它需要A車讓出A車所佔有的西邊的道路。兩車各自佔有各自的資源,且同時爭奪對方佔有的資源,互補相讓,就造成了死鎖。

     在死鎖時,執行緒間相互等待資源,而又不釋放自身的資源,導致無窮無盡的等待,其結果是系統任務永遠無法執行完成。死鎖問題是在多執行緒開發中應該堅決避免和杜絕的問題。

消除死鎖的幾種方式:

1. 最簡單、最常用的方法就是進行系統的重新啟動,不過這種方法代價很大,它意味著在這之前所有的程序已經完成的計算工作都將付之東流,包括參與死鎖的那些程序,以及未參與死鎖的程序;

2. 撤消程序,剝奪資源。終止參與死鎖的程序,收回它們佔有的資源,從而解除死鎖。這時又分兩種情況:一次性撤消參與死鎖的全部程序,剝奪全部資源;或者逐步撤消參與死鎖的程序,逐步收回死鎖程序佔有的資源。一般來說,選擇逐步撤消的程序時要按照一定的原則進行,目的是撤消那些代價最小的程序,比如按程序的優先順序確定程序的代價;考慮程序執行時的代價和與此程序相關的外部作業的代價等因素;

3. 程序回退策略,即讓參與死鎖的程序回退到沒有發生死鎖前某一點處,並由此點處繼續執行,以求再次執行時不再發生死鎖。雖然這是個較理想的辦法,但是操作起來系統開銷極大,要有堆疊這樣的機構記錄程序的每一步變化,以便今後的回退,有時這是無法做到的。

關鍵字:synchronized ;執行了鎖所屬物件的wait()方法,這個執行緒會釋放鎖;加鎖和釋放鎖的時候一定要通過try-finally的方式來操作,防止在加鎖之後程式異常退出沒有呼叫 lock.unlock() 方法釋放鎖

避免死鎖的一個通用的經驗法則是:當幾個執行緒都要訪問共享資源A、B和C時,保證使每個執行緒都按照同樣的順序去訪問他們,比如都先訪問A,再訪問B和C。

---------------------------------------------------------------------------------------------------------------------------------

yield

(1)在python中:

一個帶有 yield 的函式就是一個 generator,它和普通函式不同,生成一個 generator 看起來像函式呼叫,但不會執行任何函式程式碼,直到對其呼叫 next()(在 for 迴圈中會自動呼叫 next())才開始執行。雖然執行流程仍按函式的流程執行,但每執行到一個 yield 語句就會中斷,並返回一個迭代值,下次執行時從 yield 的下一個語句繼續執行。看起來就好像一個函式在正常執行的過程中被 yield 中斷了數次,每次中斷都會通過 yield 返回當前的迭代值。

python中生成器是迭代器的一種,使用yield返回函式值。每次呼叫yield會暫停,而可以使用next()函式和send()函式可以恢復生成器。

(2)Java執行緒中的Thread.yield( )方法:

Thread.yield( )方法即為執行緒讓步。顧名思義,就是說當一個執行緒使用了這個方法之後,它就會把自己CPU執行的時間讓掉,

讓自己或者其它的執行緒執行,注意是讓自己或者其他執行緒執行,並不是單純的讓給其他執行緒。

        yield()的作用是讓步。它能讓當前執行緒由“執行狀態”進入到“就緒狀態”,從而讓其它具有相同優先順序的等待執行緒獲取執行權;但是,並不能保證在當前執行緒呼叫yield()之後,其它具有相同優先順序的執行緒就一定能獲得執行權;也有可能是當前執行緒又進入到“執行狀態”繼續執行!舉個例子:現在有很多人在排隊上廁所,好不容易輪到這個人上廁所了,突然這個人說:“我要和大家來個競賽,看誰先搶到廁所!”,然後所有的人在同一起跑線衝向廁所,有可能是別人搶到了,也有可能他自己有搶到了。我們還知道執行緒有個優先順序的問題,那麼手裡有優先權的這些人就一定能搶到廁所的位置嗎? 不一定的,他們只是概率上大些,也有可能沒特權的搶到了。

----------------------------------------------------------------------------------------------------------------------------------

java 和python各自的優點

1. Python作為動態語言,很靈活。語法簡潔,表達力強。語法簡潔優美, 功能強大, 標準庫跟第三方庫灰常強大, 應用領域非常廣Python可以讓初學者把精力集中在程式設計物件和思維方法上,而不用去擔心語法、型別等等外在因素;

yield關鍵字:
當你需要返回很多東西然後一個一個用的時候, 你可以一次返回一個,相當於一個生成器,可以用來返回函式值。
def xrange(n):
      i = 0
      while i < n:
          yield i
          i += 1
用法:
for i in xrange(10):
     print i

2. java 優美, 嚴謹, 健壯,不易出錯(儘量避免了程式設計師犯錯, 比如自動垃圾回收, 拋棄無符號型別, 安全的列舉, 編譯期泛型檢查等等);

----------------------------------------------------------------------------------------------------------------------------------

專案裡面是怎麼讀取到郵件的?用了哪些庫?

呼叫win32com裡面的outlook介面,

import win32com.client
然後呼叫裡面的getTemplate()方法
def getTemplate(self, sheet, updateFlag = True)



關於selenium:
呼叫selenium模組下的webdriver,
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from xml.etree import ElementTree as ET
import os,time, shutil, re
from __builtin__ import classmethod
from datetime import datetime

利用裝飾器下的一個函式來規定瀏覽器下載檔案後存放的位置;webdriver下的options方法來定義了一個startChrom()函式;

登入函式:

def login(self, user, password):      
    self.driver.find_element_by_id("user").clear()
    self.driver.find_element_by_id("user").send_keys(user)
    self.driver.find_element_by_id("password").clear()
    self.driver.find_element_by_id("password").send_keys(password)
    self.driver.find_element_by_id("IMAGE1").click()
    try:
        WebDriverWait(self.driver, 10).until(EC.visibility_of_any_elements_located((By.LINK_TEXT,"Activation")))
    except Exception as e:
        print e.message
        return False
else:
        return True